<?xml version="1.0" encoding="UTF-8"?>
<vosi:tableset xmlns:vosi="http://www.ivoa.net/xml/VOSITables/v1.0"
               xmlns:vs="http://www.ivoa.net/xml/VODataService/v1.1"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <schema>
    <name>default</name>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_acs_calanc</name>
    <description>ExoMars Trace Gas Orbiter — Atmospheric Chemistry Suite PDS4 Calibration Product Ancillary</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_acs_cnirmir</name>
    <description>ExoMars Trace Gas Orbiter — Atmospheric Chemistry Suite PDS4 Calibrated Science Data from the NIR or MIR Channels</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_acs_parsc</name>
    <description>ExoMars Trace Gas Orbiter — Atmospheric Chemistry Suite PDS4 Partially Processed Science Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_acs_rawsc</name>
    <description>ExoMars Trace Gas Orbiter — Atmospheric Chemistry Suite PDS4 Raw Science Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_acs_tchanc</name>
    <description>ExoMars Trace Gas Orbiter — Atmospheric Chemistry Suite PDS4 Telecommand History Product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_cassis_calsc</name>
    <description>ExoMars Trace Gas Orbiter — Colour and Stereo Surface Imaging System PDS4 Calibrated Science Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_cassis_dersc</name>
    <description>ExoMars Trace Gas Orbiter — Colour and Stereo Surface Imaging System PDS4 Derived Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_frend_tchanc</name>
    <description>ExoMars Trace Gas Orbiter — Fine Resolution Epithermal Neutrons Detector Telecommand History Product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_nomad_calsc</name>
    <description>ExoMars Trace Gas Orbiter — Nadir and Occultation for MArs Discovery PDS4 Calibrated Science Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_nomad_parsc</name>
    <description>ExoMars Trace Gas Orbiter — Nadir and Occultation for MArs Discovery PDS4 Partially Processed Science Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_nomad_rawsc</name>
    <description>ExoMars Trace Gas Orbiter — Nadir and Occultation for MArs Discovery PDS4 Raw Science Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_em16tgo_nomad_tchanc</name>
    <description>ExoMars Trace Gas Orbiter — Nadir and Occultation for MArs Discovery PDS4 Telecommand History Product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_hrsc_dtmrdr</name>
    <description>ESA's Mars Express — High Resolution Stereo Camera PDS3 Orthophoto and Digital Terrain Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_hrsc_rdrv4</name>
    <description>ESA's Mars Express — High Resolution Stereo Camera PDS3 Version 4 Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_hrsc_refdr3</name>
    <description>ESA's Mars Express — High Resolution Stereo Camera PDS3 Version 3 Map Projected Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_hrsc_refdr4</name>
    <description>ESA's Mars Express — High Resolution Stereo Camera PDS3 Version 4 Map Projected Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_marsis_clutter</name>
    <description>ESA's Mars Express — Mars Advanced Radar for Subsurface and Ionsphere Sounding PDS4 Clutter Simulations</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_marsis_edr</name>
    <description>ESA's Mars Express — Mars Advanced Radar for Subsurface and Ionsphere Sounding PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_marsis_geom</name>
    <description>ESA's Mars Express — Mars Advanced Radar for Subsurface and Ionsphere Sounding PDS4 Geometry Table</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_marsis_ionosph</name>
    <description>ESA's Mars Express — Mars Advanced Radar for Subsurface and Ionsphere Sounding PDS4 Ionosphere Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_marsis_radarch</name>
    <description>ESA's Mars Express — Mars Advanced Radar for Subsurface and Ionsphere Sounding PDS4 Radargrams Corrected with Chapman Model</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_marsis_radarop</name>
    <description>ESA's Mars Express — Mars Advanced Radar for Subsurface and Ionsphere Sounding PDS4 Radargrams Corrected with Optimization Algorithm</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_marsis_radarun</name>
    <description>ESA's Mars Express — Mars Advanced Radar for Subsurface and Ionsphere Sounding PDS4 Uncorrected Radargrams</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_marsis_rdrais</name>
    <description>ESA's Mars Express — Mars Advanced Radar for Subsurface and Ionsphere Sounding PDS3 Reduced Data Record - Active Ionosphere Sounding</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_marsis_rdrss</name>
    <description>ESA's Mars Express — Mars Advanced Radar for Subsurface and Ionsphere Sounding PDS3 Reduced Data Record - Subsurface Sounding</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_omega_ddrgm</name>
    <description>ESA's Mars Express — Observatoire Mineralogie, Eau, Glaces, Activite PDS3 Global Maps</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_omega_edr</name>
    <description>ESA's Mars Express — Observatoire Mineralogie, Eau, Glaces, Activite PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_pfs_edr</name>
    <description>ESA's Mars Express — Planetary Fourier Spectrometer PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_vmc_edr</name>
    <description>ESA's Mars Express — Visual Monitoring Camera PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mex_vmc_rdr</name>
    <description>ESA's Mars Express — Visual Monitoring Camera PDS3 Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_moc_na_wa_nadsdp</name>
    <description>Mars Global Surveyor — Mars Orbiter Camera PDS3 Narrow Angle Decompressed Standard Data Product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_moc_na_wa_nasdp</name>
    <description>Mars Global Surveyor — Mars Orbiter Camera PDS3 Narrow Angle Standard Data Product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_moc_na_wa_wadsdp</name>
    <description>Mars Global Surveyor — Mars Orbiter Camera PDS3 Wide Angle Decompressed Standard Data Product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_moc_na_wa_wasdp</name>
    <description>Mars Global Surveyor — Mars Orbiter Camera PDS3 Wide Angle Standard Data Product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_mola_megdr</name>
    <description>Mars Global Surveyor — Mars Orbiter Laser Altimeter PDS3 Mission Experiment Gridded Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_mola_pedr</name>
    <description>Mars Global Surveyor — Mars Orbiter Laser Altimeter PDS3 Precision Experiment Data  Rec. (See Tools: MOLA PEDR Query Tool)</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_mola_prdr</name>
    <description>Mars Global Surveyor — Mars Orbiter Laser Altimeter PDS3 Precision Radiometry Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_mola_shadr</name>
    <description>Mars Global Surveyor — Mars Orbiter Laser Altimeter PDS3 Spherical Harmonic Aggregated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_mola_toponat</name>
    <description>Mars Global Surveyor — Mars Orbiter Laser Altimeter PDS4 Native Topography Swath Pair with MARSIS Observations</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_mola_topores</name>
    <description>Mars Global Surveyor — Mars Orbiter Laser Altimeter PDS4 Resampled Topography Swath Pair with MARSIS Observations</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_tes_timap</name>
    <description>Mars Global Surveyor — Thermal Emission Spectrometer PDS3 Thermal Inertia Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mgs_tes_tsdr</name>
    <description>Mars Global Surveyor — Thermal Emission Spectrometer PDS3 Time Sequential Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_ancill</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars PDS3 Ancillary Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_cdr</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars PDS3 Calibration Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_ddr</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars PDS4 Derived Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_edr</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_ldr</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars PDS3 Limb Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_lmlp</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars PDS4 ATO S Data LML (Log Maximum Likelihood) Regularized and Noise-Abated Map Projected Product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_mrdr4</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars PDS4 Multispectral Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_mtrdr</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars PDS4 Map-Projected Targeted Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_ter</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars PDS4 Targeted Empirical Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_trdr</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars Targeted Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_valrep</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars PDS3 Validation Report</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_crism_vrdr</name>
    <description>Mars Reconnaissance Orbiter — Compact Reconnaissance Imaging Spectrometer for Mars PDS4 Map Projected VNIR Hyperspectral RDR</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_ctx_edr</name>
    <description>Mars Reconnaissance Orbiter — Context Camera PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_hirise_anagly</name>
    <description>Mars Reconnaissance Orbiter — High-Resolution Imaging Science Experiment PDS3 Anaglyph Image</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_hirise_anagly4</name>
    <description>Mars Reconnaissance Orbiter — High-Resolution Imaging Science Experiment PDS4 Anaglyph Image</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_hirise_dtm</name>
    <description>Mars Reconnaissance Orbiter — High-Resolution Imaging Science Experiment PDS3 Digital Terrain Model</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_hirise_edr</name>
    <description>Mars Reconnaissance Orbiter — High-Resolution Imaging Science Experiment PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_hirise_edr4</name>
    <description>Mars Reconnaissance Orbiter — High-Resolution Imaging Science Experiment PDS4 Experiment Data Record - Raw Image</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_hirise_rdr</name>
    <description>Mars Reconnaissance Orbiter — High-Resolution Imaging Science Experiment PDS3 Reduced Data Record w/o Embedded Map Projection</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_hirise_rdr4</name>
    <description>Mars Reconnaissance Orbiter — High-Resolution Imaging Science Experiment PDS4 Reduced Data Record with Embedded Map Projection</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_hirise_rdrv11</name>
    <description>Mars Reconnaissance Orbiter — High-Resolution Imaging Science Experiment PDS3 Reduced Data Record with Embedded Map Projection</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_mcs_ddr</name>
    <description>Mars Reconnaissance Orbiter — Mars Climate Sounder PDS3 Derived Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_mcs_edr</name>
    <description>Mars Reconnaissance Orbiter — Mars Climate Sounder PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_mcs_rdr</name>
    <description>Mars Reconnaissance Orbiter — Mars Climate Sounder PDS3 Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_rss_edr</name>
    <description>Mars Reconnaissance Orbiter — Radio Science Subsystem PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_rss_rsdmap</name>
    <description>Mars Reconnaissance Orbiter — Radio Science Subsystem PDS3 RSS  Digital Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_rss_shadr</name>
    <description>Mars Reconnaissance Orbiter — Radio Science Subsystem PDS3 Spherical Harmonics Gravity ASCII Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_rss_shbdr</name>
    <description>Mars Reconnaissance Orbiter — Radio Science Subsystem PDS3 Spherical Harmonics Gravity Binary Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_sharad_edr</name>
    <description>Mars Reconnaissance Orbiter — Shallow Radar PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_sharad_rdr</name>
    <description>Mars Reconnaissance Orbiter — Shallow Radar PDS3 Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_sharad_sharad3d</name>
    <description>Mars Reconnaissance Orbiter — Shallow Radar PDS4 3D RADAR Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_sharad_shsimu</name>
    <description>Mars Reconnaissance Orbiter — Shallow Radar PDS4 SHARAD Surface Clutter Simulations</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_sharad_usgeomv2</name>
    <description>Mars Reconnaissance Orbiter — Shallow Radar PDS4 Geographic, Geometric, and Ionospheric Properties V2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_mro_sharad_usrdrv2</name>
    <description>Mars Reconnaissance Orbiter — Shallow Radar PDS4 Reduced Data Record V2 of Radar Backscatter Power</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_ahd</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 Averaged HEND Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_and</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 Averaged Neutron Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_cgs</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 Correct Gamma Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_cmdlst</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 Command List</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_cmdlst4</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 Command List</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_dhd</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 Derived HEND Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_dnd</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 Derived Neutron Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_ekernl</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 E Kernel</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_ekernl4</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 E Kernel</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_elemts</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 Element Concentrations Maps</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_gammas</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 Gamma Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_gammas4</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 Gamma Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_grseng</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 GRS Engineering Records</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_grseng4</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 GRS Engineering Records</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_hends</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 HEND Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_hends4</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 HEND Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_idnd</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 Improved Derived Neutron Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_messlg</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 Message Log</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_messlg4</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 Message Log</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_neutns</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 Neutron Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_neutns4</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 Neutron Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_profil</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 Profile Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_profil4</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 Profile Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_pulsrs</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 Pulser Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_pulsrs4</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS4 Pulser Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_grs_sgs</name>
    <description>2001 Mars Odyssey Orbiter — Gamma Ray Spectrometer PDS3 Summed Gamma Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_irbtr</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Infrared Brightness Temperature Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_irbtr4</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS4 Infrared Brightness Temperature Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_iredr</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Infrared Raw Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_iredr4</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS4 Infrared Raw Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_irgeo1</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Infrared Geometric Projection V1</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_irgeo2</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Infrared Geometric Projection V2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_irgeo4</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS4 Infrared Geometric Projection Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_irpbt1</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Infrared Projected Brightness Temperature ImageV1</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_irpbt2</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Infrared Projected Brightness Temperature Image</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_irpbt4</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS4 Infrared Projected Brightness Temperature Image</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_irrdr</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Infrared Calibrated Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_irrdr4</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS4 Infrared Calibrated Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_vgeo1</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Visible Geometric Projection V1</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_vgeo2</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Visible Geometric Projection V2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_vgeo4</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS4 Visible Geometric Projection Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_visabr</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Visible Apparent Brightness Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_visabr4</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS4 Visible Apparent Brightness Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_visalb</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Visible Projected Albedo Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_visalb4</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS4 Visible Projected Albedo Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_visedr</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Visible Raw Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_visedr4</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS4 Visible Raw Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_visrdr</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS3 Visible Calibrated Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_ody_themis_visrdr4</name>
    <description>2001 Mars Odyssey Orbiter — Thermal Emission Imaging System PDS4 Visible Calibrated Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_vo_visab_dtm</name>
    <description>Viking Orbiter 1 and 2 — Visual Imaging Subsystem Camera A/B PDS3 Digital Terrain Models</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_vo_visab_edr</name>
    <description>Viking Orbiter 1 and 2 — Visual Imaging Subsystem Camera A/B PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_vo_visab_mdim</name>
    <description>Viking Orbiter 1 and 2 — Visual Imaging Subsystem Camera A/B PDS3 Mosaicked Digital Image Models</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_vo_visab_mdimc</name>
    <description>Viking Orbiter 1 and 2 — Visual Imaging Subsystem Camera A/B PDS3 Multi-look Color - Mosaicked Digital Image Models</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mars_vo_visab_mdimh</name>
    <description>Viking Orbiter 1 and 2 — Visual Imaging Subsystem Camera A/B PDS3 High Resolution - Mosaicked Digital Image Models</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_cal_ac</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Anti-Coincidence Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_cal_raw</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Ge Raw Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_cal_scr</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Shield Count Rate</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_cal_sh</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Shield Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_cal_sh2</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Shield Spectra 2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_cal_sh3</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Shield Spectra 3</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_command</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Command</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_dap</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_fpga</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 FPGA ADC Diagnostic Information</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_grs_eng</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Engineering</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_hpge_ac</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Anti-Coincident Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_hpge_raw</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 HPGe Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_meap4</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Thermal Neutron Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_meap5</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Enhanced Gamma Ray Spectrometry Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_microphonics</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Microphonics</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_ratecounters</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Software Telemetry</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_rdr_sum</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Spectral Sum</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_shield_counter</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Anti-Coincidence Shield</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_shield_spectra</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Shield Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_shield_spectra2</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Shield Spectra 2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_grs_status</name>
    <description>MESSENGER — Gamma Ray Spectrometer PDS4 Telemetry Status</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mascs_ddr</name>
    <description>MESSENGER — Mercury Atmospheric and Surface Composition Spectrometer PDS3 UVVS and VIRS Combined Spectrum Derived Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mascs_map</name>
    <description>MESSENGER — Mercury Atmospheric and Surface Composition Spectrometer PDS4 VIRS Weathering Maps</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mascs_meap1</name>
    <description>MESSENGER — Mercury Atmospheric and Surface Composition Spectrometer PDS4 VIRS Spectral Cube</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mascs_meap2</name>
    <description>MESSENGER — Mercury Atmospheric and Surface Composition Spectrometer PDS4 UVVS Spectral Cube</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mascs_uvvcdr</name>
    <description>MESSENGER — Mercury Atmospheric and Surface Composition Spectrometer PDS3 UVVS Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mascs_uvvddr</name>
    <description>MESSENGER — Mercury Atmospheric and Surface Composition Spectrometer PDS3 UVVS Derived Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mascs_uvvedr</name>
    <description>MESSENGER — Mercury Atmospheric and Surface Composition Spectrometer PDS3 UVVS Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mascs_vircdr</name>
    <description>MESSENGER — Mercury Atmospheric and Surface Composition Spectrometer PDS3 VIR Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mascs_virdap</name>
    <description>MESSENGER — Mercury Atmospheric and Surface Composition Spectrometer PDS3 VIR Derived Analysis Product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mascs_virddr</name>
    <description>MESSENGER — Mercury Atmospheric and Surface Composition Spectrometer PDS3 VIR Derived Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mascs_viredr</name>
    <description>MESSENGER — Mercury Atmospheric and Surface Composition Spectrometer PDS3 VIRS Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_nac_cdrnac</name>
    <description>MESSENGER — Mercury Dual Imaging System - Narrow Angle Camera PDS4 Narrow-angle Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_nac_ddrnac</name>
    <description>MESSENGER — Mercury Dual Imaging System - Narrow Angle Camera PDS4 Narrow-angle Derived Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_nac_dem</name>
    <description>MESSENGER — Mercury Dual Imaging System - Narrow Angle Camera PDS4 MDIS Digital Elevation Model</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_nac_edrnac</name>
    <description>MESSENGER — Mercury Dual Imaging System - Narrow Angle Camera PDS4 Narrow-angle Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_nac_rtmnac</name>
    <description>MESSENGER — Mercury Dual Imaging System - Narrow Angle Camera PDS4 Narrow-angle Map-projected Regional Targeted Mosaic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_cdrwac</name>
    <description>MESSENGER — Mercury Dual Imaging System - Wide Angle Camera PDS4 Wide-angle Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_ddrwac</name>
    <description>MESSENGER — Mercury Dual Imaging System - Wide Angle Camera PDS4 Wide-angle Derived Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_edrwac</name>
    <description>MESSENGER — Mercury Dual Imaging System - Wide Angle Camera PDS4 Wide-angle Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_mapmp5</name>
    <description>MESSENGER — Mercury Dual Imaging System - Wide Angle Camera PDS4 Wide-angle Map-projected 5-Color Multispectral RDR</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_mdrwac</name>
    <description>MESSENGER — Mercury Dual Imaging System - Wide Angle Camera PDS4 Wide-angle Map-projected Multispectral Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_nac_dem</name>
    <description>MESSENGER — Mercury Dual Imaging System PDS4 MDIS Digital Elevation Model</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_nac_maphie</name>
    <description>MESSENGER — Mercury Dual Imaging System PDS4 Map-projected High-incidence East-illumination Basemap</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_nac_maphiw</name>
    <description>MESSENGER — Mercury Dual Imaging System PDS4 Map-proj. High-incidence West-illumination Basemap</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_nac_maploi</name>
    <description>MESSENGER — Mercury Dual Imaging System PDS4 Map-projected Low-Incidence Angle Basemap</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_nac_photo</name>
    <description>MESSENGER — Mercury Dual Imaging System PDS4 Nathair Facula Photometric Cube Data V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_nac_rdrbdr</name>
    <description>MESSENGER — Mercury Dual Imaging System PDS4 Map-projected Basemap Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_nac_topo</name>
    <description>MESSENGER — Mercury Dual Imaging System PDS4 Nathair Facula Topography Data V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_rdrmdr</name>
    <description>MESSENGER — Mercury Dual Imaging System - Wide Angle Camera PDS4 Map-projected Multispectral Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mdis_wac_rtmwac</name>
    <description>MESSENGER — Mercury Dual Imaging System - Wide Angle Camera PDS4 Wide-angle Map-projected Regional Targeted Mosaic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mla_hdiagnostic</name>
    <description>MESSENGER — Mercury Laser Altimeter PDS4 Hardware Diagnostic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mla_hdiagnosticcdr</name>
    <description>MESSENGER — Mercury Laser Altimeter PDS4 Hardware Diagnostic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mla_radr</name>
    <description>MESSENGER — Mercury Laser Altimeter PDS4 Geolocated Radiometric</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mla_scicdr</name>
    <description>MESSENGER — Mercury Laser Altimeter PDS4 Science</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mla_sciedr</name>
    <description>MESSENGER — Mercury Laser Altimeter PDS4 Science</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mla_scigdr</name>
    <description>MESSENGER — Mercury Laser Altimeter PDS4 Gridded Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mla_scirdrv1</name>
    <description>MESSENGER — Mercury Laser Altimeter PDS4 Geolocated Science V1</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mla_scirdrv2</name>
    <description>MESSENGER — Mercury Laser Altimeter PDS4 Geolocated Science V2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mla_shadr</name>
    <description>MESSENGER — Mercury Laser Altimeter PDS4 Spherical Harmonics ASCII</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mla_status</name>
    <description>MESSENGER — Mercury Laser Altimeter PDS4 Engineering</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_mla_statuscdr</name>
    <description>MESSENGER — Mercury Laser Altimeter PDS4 Engineering</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_cdr_counts</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Counter</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_cdr_eng</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Engineering</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_cdr_gamma_burst</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Gamma Burst</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_cdr_gcr_spectra</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Galactic Cosmic Ray Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_cdr_spectra</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_ddr_ncp</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Relative Neutron Count Rate</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_ddr_ncr</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Neutron Count Rate</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_meap3</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Energetic Electron Event Tables</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_raw_calibration</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Calibration and Diagnostic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_raw_command</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Command</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_raw_counts</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Time-Correlated Counts</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_raw_events</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Event Mode</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_raw_full_spectra</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Full Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_raw_gamma_burst</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Gamma Burst</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_raw_gcr_spectra</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Galactic Cosmic Ray Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_raw_short_science</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Short Science Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_raw_spectra</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_ns_raw_status</name>
    <description>MESSENGER — Neutron Spectrometer PDS4 Telemetry Status</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_ant4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Antenna Configuration Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_ddor4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Delta-differential One-way Range Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_ion4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Ionosphere (media) Calibration Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_ltf4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Light Time Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_mdm4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Momentum Dump Maneuver Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_mpd4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Maneuver Performance Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_occ</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Occultation Summary</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_odf4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Compressed Version of TNF</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_rsr4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Radio Science Receiver Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_sff4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Small Forces Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_shadr</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Spherical Harmonics ASCII</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_shbdr</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Spherical Harmonics Binary</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_tnf4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Tracking and Navigation File (TRK-2-34 data) Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_tro4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 Troposphere (media) Calibration Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_rss_wea4</name>
    <description>MESSENGER — Radio Science Subsystem PDS4 DSN Weather Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_xrs_command</name>
    <description>MESSENGER — X-Ray Spectrometer PDS4 Command</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_xrs_edr</name>
    <description>MESSENGER — X-Ray Spectrometer PDS4 Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_xrs_footprint</name>
    <description>MESSENGER — X-Ray Spectrometer PDS4 Footprint</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_xrs_rdrmap</name>
    <description>MESSENGER — X-Ray Spectrometer PDS4 Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_mercury_messenger_xrs_xrscdr</name>
    <description>MESSENGER — X-Ray Spectrometer PDS4 Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_arcb_nrao_rtls_gbt_radl1</name>
    <description>Arecibo Observatory/National Radio Astronomy Observatory — Earth-based Arecibo Radio Telescope/Robert C. Byrd Green Bank Telescope PDS3 Resampled Radar Map at Level 1</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_arcb_nrao_rtls_gbt_radl2</name>
    <description>Arecibo Observatory/National Radio Astronomy Observatory — Earth-based Arecibo Radio Telescope/Robert C. Byrd Green Bank Telescope PDS3 Derived Radar Map at Level 2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_arcb_nrao_rtls_gbt_sradl2</name>
    <description>Arecibo Observatory/National Radio Astronomy Observatory — Earth-based Arecibo Radio Telescope/Robert C. Byrd Green Bank Telescope PDS3 Sband Radar Map at Level 2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_ce_mrm_calce1</name>
    <description>Chang&amp;apos;e — Microwave Radiometer Chang&amp;apos;e-1 Microwave Radiometer Calibrated Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_ce_mrm_calce2</name>
    <description>Chang&amp;apos;e — Microwave Radiometer Chang&amp;apos;e-2 Microwave Radiometer Calibrated Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_ce_mrm_map</name>
    <description>Chang&amp;apos;e — Microwave Radiometer Time-Binned Microwave Radiometer Brightness Temperature Maps</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_ch1_orb_m3_calimg</name>
    <description>ISRO's Chandrayaan-1 — Moon Mineralogy Mapper PDS3 Calibrated Image Version 1</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_ch1_orb_m3_caliv2</name>
    <description>ISRO's Chandrayaan-1 — Moon Mineralogy Mapper PDS3 Calibrated Image Version 2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_ch1_orb_m3_caliv3</name>
    <description>ISRO's Chandrayaan-1 — Moon Mineralogy Mapper PDS3 Calibrated Image Version 3</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_ch1_orb_m3_rawimg</name>
    <description>ISRO's Chandrayaan-1 — Moon Mineralogy Mapper PDS3 Raw Image</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_ch1_orb_m3_refimg</name>
    <description>ISRO's Chandrayaan-1 — Moon Mineralogy Mapper PDS3 Reflectance Image</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_ch1_orb_mrffr_cdr</name>
    <description>ISRO's Chandrayaan-1 — Forerunner (aka "Mini-RF" or "Mini-SAR") PDS4 Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_ch1_orb_mrffr_mapcdr</name>
    <description>ISRO's Chandrayaan-1 — Forerunner (aka "Mini-RF" or "Mini-SAR") PDS4 Map-Projected Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_ch1_orb_mrffr_moscdr</name>
    <description>ISRO's Chandrayaan-1 — Forerunner (aka "Mini-RF" or "Mini-SAR") PDS4 Mosaic Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_a_star_edr</name>
    <description>Clementine — A-STAR PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_b_star_edr</name>
    <description>Clementine — B-STAR PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_hires_edr</name>
    <description>Clementine — High Resolution Camera PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_hires_mdim</name>
    <description>Clementine — High Resolution Camera PDS3 High Resolution Mosaic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_lidar_map</name>
    <description>Clementine — LIDAR PDS4 LIDAR Topography Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_lidar_tab</name>
    <description>Clementine — LIDAR PDS4 LIDAR Topography Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_lidar_topo</name>
    <description>Clementine — LIDAR PDS4 Aggregated Topogtaphic Ranges and Related Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_lwir_edr</name>
    <description>Clementine — Long Wavelength Infrared Camera PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_lwir_rdr</name>
    <description>Clementine — Long Wavelength Infrared Camera PDS4 Calibrated Brightness Temperature Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_nir_edr</name>
    <description>Clementine — Near Infrared Camera PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_nir_mdim</name>
    <description>Clementine — Near Infrared Camera PDS3 NIR 6-band Digital Image Model</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_rss_bsr1</name>
    <description>Clementine — Radio Science Subsystem PDS3 Raw Bistatic Radar Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_rss_bsr5</name>
    <description>Clementine — Radio Science Subsystem PDS4 Reduced Bistatic Radar Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_rss_bsrsort</name>
    <description>Clementine — Radio Science Subsystem PDS4 Reduced Bistatic Radar Sort Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_rss_fnd</name>
    <description>Clementine — Radio Science Subsystem PDS4 Partially Processed Time Samples</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_rss_map</name>
    <description>Clementine — Radio Science Subsystem PDS4 Gravity Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_rss_tab</name>
    <description>Clementine — Radio Science Subsystem PDS4 Gravity Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_uvvis_edr</name>
    <description>Clementine — Ultraviolet/Visible Camera PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_uvvis_mdim</name>
    <description>Clementine — Ultraviolet/Visible Camera PDS3 UVVIS 5-Band Mosaic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_clem_uvvis_mdimg</name>
    <description>Clementine — Ultraviolet/Visible Camera PDS3 UVVIS Global Basemap Mosaic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_grail_lgrs_cdrl1a</name>
    <description>Gravity Recovery and Interior Laboratory — LGRS-A or LGRS-B PDS3 Level 1A Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_grail_lgrs_cdrl1b</name>
    <description>Gravity Recovery and Interior Laboratory — LGRS-A or LGRS-B PDS3 Level 1B Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_grail_lgrs_edr</name>
    <description>Gravity Recovery and Interior Laboratory — LGRS-A or LGRS-B PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_grail_lgrs_rsdmap</name>
    <description>Gravity Recovery and Interior Laboratory — LGRS-A or LGRS-B PDS4 Radio Science Digital Map Products</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_grail_lgrs_rssedr</name>
    <description>Gravity Recovery and Interior Laboratory — LGRS-A or LGRS-B PDS3 Radio Science Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_grail_lgrs_shadr</name>
    <description>Gravity Recovery and Interior Laboratory — LGRS-A or LGRS-B PDS4 Spherical Harmonics ASCII</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_grail_lgrs_shbdr</name>
    <description>Gravity Recovery and Interior Laboratory — LGRS-A or LGRS-B PDS4 Spherical Harmonics Binary</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_kplo_shadowcam_cal</name>
    <description>Korea Pathfinder Lunar Orbiter — Shadow Camera PDS4 Calibrated Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_kplo_shadowcam_cmos</name>
    <description>Korea Pathfinder Lunar Orbiter — Shadow Camera PDS4 Controlled Mosaic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_kplo_shadowcam_dtm</name>
    <description>Korea Pathfinder Lunar Orbiter — Shadow Camera PDS4 DTM</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_kplo_shadowcam_raw</name>
    <description>Korea Pathfinder Lunar Orbiter — Shadow Camera PDS4 Raw Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_kplo_shadowcam_umos</name>
    <description>Korea Pathfinder Lunar Orbiter — Shadow Camera PDS4 Uncontrolled Mosaic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lo_24inch_flc_cdr</name>
    <description>Lunar Orbiter — 24 Inch Focal Length Camera PDS3 Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lo_80mm_flc_cdr</name>
    <description>Lunar Orbiter — 80mm Focal Length Camera PDS3 Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_er_datal2</name>
    <description>Lunar Prospector — Electron Reflectometer PDS4 Electron Reflection Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_er_er_3d</name>
    <description>Lunar Prospector — Electron Reflectometer PDS4 3-D Electron Flux Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_er_er_hi</name>
    <description>Lunar Prospector — Electron Reflectometer PDS4 High Resolution Electron Flux Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_er_er_lo</name>
    <description>Lunar Prospector — Electron Reflectometer PDS4 Low Resolution Electron Flux Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_grs_derabu</name>
    <description>Lunar Prospector — Gamma Ray Spectrometer PDS4 Gamma Ray Spectra Elemental Abundance Product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_grs_mdr</name>
    <description>Lunar Prospector — Gamma Ray Spectrometer, Neutron Spectrometer, APS, Magnetometer,Electron Reflectometer Raw Data PDS3 Lunar Prospector MERGED Level 0 Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_grs_rdr</name>
    <description>Lunar Prospector — Gamma Ray Spectrometer PDS4 Gamma Ray Spectra Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_mag_data</name>
    <description>Lunar Prospector — Magnetometer PDS4 Vector Measurements Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_mag_datal2</name>
    <description>Lunar Prospector — Magnetometer PDS4 Crustal Magnetic Field Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_mag_datal3</name>
    <description>Lunar Prospector — Magnetometer PDS4 Regional Field Bins at the Spacecraft Altitude Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_mag_datal4</name>
    <description>Lunar Prospector — Magnetometer PDS4 Large-Scale Vector Field Maps Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_ns_rdr</name>
    <description>Lunar Prospector — Neutron Spectrometer PDS4 Neutron_Counting_Rate Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_rss_gragod</name>
    <description>Lunar Prospector — Radio Science Subsystem PDS4 Goddard Gravity Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_rss_grajpl</name>
    <description>Lunar Prospector — Radio Science Subsystem PDS4 JPL Gravity Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lp_rss_losapdr</name>
    <description>Lunar Prospector — Radio Science Subsystem PDS3 Line of Sight Acceleration Profile Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_dlre_edr4</name>
    <description>Lunar Reconnaissance Orbiter — DIVINER Lunar Radiometer Experiment PDS4 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_dlre_epf</name>
    <description>Lunar Reconnaissance Orbiter — DIVINER Lunar Radiometer Experiment PDS4 Emission Phase Function (EPF) Products</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_dlre_gcp</name>
    <description>Lunar Reconnaissance Orbiter — DIVINER Lunar Radiometer Experiment PDS4 Global Cumulative Products</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_dlre_gdr_l2</name>
    <description>Lunar Reconnaissance Orbiter — DIVINER Lunar Radiometer Experiment PDS4 Gridded Data Record Level 2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_dlre_gdr_l3</name>
    <description>Lunar Reconnaissance Orbiter — DIVINER Lunar Radiometer Experiment PDS4 Gridded Data Record Level 3</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_dlre_ghrm</name>
    <description>Lunar Reconnaissance Orbiter — DIVINER Lunar Radiometer Experiment PDS4 Global High-Resolution Mosaic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_dlre_pcp</name>
    <description>Lunar Reconnaissance Orbiter — DIVINER Lunar Radiometer Experiment PDS4 Polar Cumulative Products</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_dlre_prp</name>
    <description>Lunar Reconnaissance Orbiter — DIVINER Lunar Radiometer Experiment PDS4 Polar Resource Products</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_dlre_rcp</name>
    <description>Lunar Reconnaissance Orbiter — DIVINER Lunar Radiometer Experiment PDS4 Regional Cumulative Products</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_dlre_rdr4</name>
    <description>Lunar Reconnaissance Orbiter — DIVINER Lunar Radiometer Experiment PDS4 Reduced Data Record (See Tools: DIVINER RDR Query Tool)</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lamp_edr</name>
    <description>Lunar Reconnaissance Orbiter — Lyman-Alpha Mapping Project PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lamp_edr4</name>
    <description>Lunar Reconnaissance Orbiter — Lyman-Alpha Mapping Project PDS4 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lamp_gdr</name>
    <description>Lunar Reconnaissance Orbiter — Lyman-Alpha Mapping Project PDS3 Gridded Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lamp_rdr</name>
    <description>Lunar Reconnaissance Orbiter — Lyman-Alpha Mapping Project PDS3 Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lamp_rdr4</name>
    <description>Lunar Reconnaissance Orbiter — Lyman-Alpha Mapping Project PDS4 Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lend_edrsci4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Exploration Neutron Detector PDS4 Raw Science Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lend_rdrald4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Exploration Neutron Detector PDS4 Averaged LEND Counts Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lend_rdrdld4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Exploration Neutron Detector PDS4 Derived LEND Counts Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lend_rdrdlx4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Exploration Neutron Detector PDS4 Extended Derived LEND Counts Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lend_rdrrsci4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Exploration Neutron Detector PDS4 Rectified Science Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_edr</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_gdrdac</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Gridded Data Record Albedo Counts</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_gdrdam</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Gridded Data Record Albedo Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_gdrdec</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Gridded Data Record of Digital Elevation Counts</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_gdrdem</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Gridded Data Record Shape Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_gdrdgm</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS3 Gridded Data Record Geoid</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_gdrdrc</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Gridded Data Record Roughness Counts</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_gdrdrm</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Gridded Data Record Roughness Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_gdrdsm</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Gridded Data Record Slope Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_gdrpsr</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS3 Gridded Data Record Permanently Shadowed Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_gdrsky</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS3 Gridded Data Record Sky Visibility</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_gdrvis</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS3 Gridded Data Record of the Average Visibility of the Sun</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_radr</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Radiometric Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_rdr4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Reduced Data  Record (See Tools: LOLA RDR Query Tool)</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_rmhe</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS3 Roughness Map Extra - Hurst Exponents</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_rmmas</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS3 Roughness Map Extra - Median Absolute Slope</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_sha</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Spherical Harmonic Data Records</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lola_sldem</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Orbiter Laser Altimeter PDS4 Digital Elevation Model Coregistered with SELENE Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_anagly</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 NAC Anaglyph Image</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_aspdtm</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Special Data Products - NAC Digital Elevation Model Generated Using ISIS and ASP</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_bdr</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Binned Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_bdrnpl</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Binned Data Record Narrow Angle Camera Pole</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_bdrroi</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Binned Data Record Region of Interest</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_bdrwgl</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Binned Data Record Wide Angle Camera Global</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_bdrwmv</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Binned Data Record Movie</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_cdrnac4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Calibrated Data Record Narrow Angle Camera</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_cdrwac4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Calibrated Data Record Wide Angle Camera - Color</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_cdrwam4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Calibrated Data Record Wide Angle Camera - Mono</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_cdrwau4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Calibrated Data Record Wide Angle Camera - UV</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_cdrwav4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Calibrated Data Record Wide Angle Camera - Vis</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_edrnac4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Experiment Data Record Narrow Angle Camera</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_edrwac4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Experiment Data Record Wide Angle Camera - Color</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_edrwam4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Experiment Data Record Wide Angle Camera - Mono</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_edrwau4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Experiment Data Record Wide Angle Camera - UV</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_edrwav4</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Experiment Data Record Wide Angle Camera - Vis</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_mdremp</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Empirically Normalized 7-Color Reflectance of the Moon</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_mdrhap</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Photometrically normalized 7-color semi-global mosaic using Hapke parameter maps</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_sdndtm</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Special Data Products - NAC Digital Terrain Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_sdppho</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Special Data Products - Map projected NAC photometric product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_sdpwmg</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Special Data Products -  WAC Monthly Global Mosaic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_sdwdtm</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Special Data Products - WAC Digital Terrain Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_sdwhap</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Special Data Products - Hapke photometric parameter maps</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_lroc_sdwtio</name>
    <description>Lunar Reconnaissance Orbiter — Lunar Reconnaissance Orbiter Camera PDS4 Special Data Products - WAC TiO2 Abundance Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_bsddr</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS3 Bistatic Derived Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_bsddr4</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS4 Bistatic Derived Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_bsddrv3</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS3 Bistatic Derived Data Record V3</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_bsedr</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS3 Bistatic Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_bsedr4</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS4 Bistatic Raw Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_bsedrv3</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS3 Bistatic Experiment Data Record V3</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_bsrdr</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS3 Bistatic Reduced Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_bsrdr4</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS4 Bistatic Calibrated Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_bsrdrv3</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS3 Bistatic Reduced Data Record V3</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_cdr</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS3 Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_mapcdr</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS3 Map-Projected Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_moscdr</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS3 Mosaic Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_mosddr</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS4 Derived Global Mosaic Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_lro_mrflro_pdr</name>
    <description>Lunar Reconnaissance Orbiter — MINI-RF LRO PDS3 Packetized Data Product</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_ard_event</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Alpha Ray Detector PDS3 EVENT V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_grs_engspe</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Gamma Ray Spectrometer PDS3 Energy Spectrum V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_grs_imap</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Gamma Ray Spectrometer PDS3 Gamma-Ray Map V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_grs_nmap1</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Gamma Ray Spectrometer PDS3 Nuclide Map V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_grs_nmap2</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Gamma Ray Spectrometer PDS3 Nuclide Map V2.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_hdtv_hdtvedr</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — High Definition Television PDS3 HDTV FITS Image</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lalt_laltrd</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Laser Altimeter PDS3 Range Data V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lalt_laltsh</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Laser Altimeter PDS3 Shperical Harmonics of Topography V2.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lalt_laltts</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Laser Altimeter PDS3 Time Series Topographic Data V2.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lalt_topom</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Laser Altimeter PDS3 Topographic Map V2.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lalt_topon</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Laser Altimeter PDS3 Topographic Grid Data V2.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lmag_lmagts</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Magnetometer PDS3 Magnetic Field Time Series V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lmag_magd</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Magnetometer PDS3 Magnetic Anomaly Grid V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lmag_mamap</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Magnetometer PDS3 Magnetic Anomaly Map V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lmag_sigma</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Magnetometer PDS3 1D Electrical Conductivity Structure V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lrs_gsimap</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Radar Sounder PDS3 Sounder Geologic Structure Map V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lrs_sar05c</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Radar Sounder PDS3 Sounder Subsurface SAR 5km Complex V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lrs_sar05p</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Radar Sounder PDS3 Sounder Subsurface SAR 5km Power V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lrs_sar10c</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Radar Sounder PDS3 Sounder Subsurface SAR 10km Complex V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lrs_sar10p</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Radar Sounder PDS3 Sounder Subsurface SAR 10km Power V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lrs_sar40p</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Radar Sounder PDS3 Sounder Subsurface SAR 40km Power V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lrs_ssh</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Radar Sounder PDS3 Sounder High Resolution Subsurface Cross Section V2.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lrs_ssl</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Radar Sounder PDS3 Sounder Low Resolution Subsurface Cross Section V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lrs_waveh</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Radar Sounder PDS3 SDRA Waveform High Sampling Rate V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_lrs_wavel</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Lunar Radar Sounder PDS3 SDRA Waveform Low Sampling Rate V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_mi_mi3c</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Multiband Imager PDS3 Level3c5 V3.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_mi_mimap</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Multiband Imager PDS3 Map V3.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_mi_nir2b</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Multiband Imager PDS3 Near-Infrared Level2b2 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_mi_nir2c</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Multiband Imager PDS3 Near-Infrared Level2c2 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_mi_vis2b</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Multiband Imager PDS3 Visible Level2b2 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_mi_vis2c</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Multiband Imager PDS3 Visible Level2c2 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_pace_etsum</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Plasma Energy Angle and Composition Experiment PDS3 E-T Diagram Summary V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_pace_pbf</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Plasma Energy Angle and Composition Experiment PDS3 Electron/Ion Energy Spectrum (Pbf1) V3.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_rsat_vrad_grav</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Relay Satellite / VLBI Radio Source PDS3 Gravity Field Data V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_rsat_vrad_trajm</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Relay Satellite / VLBI Radio Source PDS3 RSAT Main Orbiter Trajectory V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_rsat_vrad_trajr</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Relay Satellite / VLBI Radio Source PDS3 RSTAR Trajectory V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_rsat_vrad_trajv</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Relay Satellite / VLBI Radio Source PDS3 VRAD Trajectory V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_rsat_vrad_vradd</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Relay Satellite / VLBI Radio Source PDS3 VLBI Doubly Differenced 1-Way Range V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_spice_kernel_ck</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — SELENE SPICE Kernels PDS3 Reconstructed CK file</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_spice_kernel_fk</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — SELENE SPICE Kernels PDS3 Text FK file</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_spice_kernel_ik</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — SELENE SPICE Kernels PDS3 IK file</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_spice_kernel_lsk</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — SELENE SPICE Kernels PDS3 Leapseconds Kernel file</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_spice_kernel_pck</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — SELENE SPICE Kernels PDS3 Binary PCK file</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_spice_kernel_sclk</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — SELENE SPICE Kernels PDS3 Text SCLK kernel file</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_spice_kernel_spk</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — SELENE SPICE Kernels PDS3 Reconstructed SPK file</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcdemo</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 DEM Ortho V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcdtmm</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 DTM Map V2.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcdtmms</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 DTM Map Seamless V2.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcdtmo</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 DTM Ortho V3.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcevem</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 Evening Map V4.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcmorm</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 Morning Map V4.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcort</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 Ortho Map V2.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcorts</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 Ortho Map Seamless V2.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcsl2b</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 MONO Level2B0 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcsldem</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 SLDEM2013 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcsps</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 SP Support Level2B0 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_tc_tcwl2b</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Terrain Camera PDS3 Stereo Level2B0 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_upi_plasma</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Upper-Atmosphere and Plasma Imager PDS3 Tex 5 Plasmasphere He V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_upi_tvisdk</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Upper-Atmosphere and Plasma Imager PDS3 TVIS 5 Dark Level2 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_upi_tvisn2</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Upper-Atmosphere and Plasma Imager PDS3 TVIS 5 N2 Level2 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_upi_tvisna</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Upper-Atmosphere and Plasma Imager PDS3 TVIS 5 NA Level2 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_upi_tviso5</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Upper-Atmosphere and Plasma Imager PDS3 TVIS 5 O 557 Level2 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_upi_tviso6</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Upper-Atmosphere and Plasma Imager PDS3 TVIS 5 O 630 Level2 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_moon_sln_upi_tvisoh</name>
    <description>JAXA SELENE/KAGUYA Main Orbiter — Upper-Atmosphere and Plasma Imager PDS3 TVIS 5 OH Level2 V1.0</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_arcb_nrao_rtls_gbt_mlmap</name>
    <description>Arecibo Observatory and National Radio Astronomy Observatory — Radio Telescope / Robert C. Byrd Green Bank Telescope PDS4 Multi-Look Maps</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_arcb_nrao_rtls_gbt_rad</name>
    <description>Arecibo Observatory and National Radio Astronomy Observatory — Radio Telescope / Robert C. Byrd Green Bank Telescope PDS3 Radar Backscatter Image</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_arcb_rtls_rad</name>
    <description>Arecibo Observatory — Radio Telescope PDS3 Radar Backscatter Image</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_cal_ac</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Anti-Coincidence Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_cal_raw</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Ge Raw Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_cal_scr</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Shield Count Rate</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_cal_sh</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Shield Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_cal_sh2</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Shield Spectra 2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_cal_sh3</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Shield Spectra 3</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_command</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Command</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_dap</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_fpga</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 FPGA ADC Diagnostic Information</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_grs_eng</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Engineering</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_hpge_ac</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Anti-Coincident Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_hpge_raw</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 HPGe Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_microphonics</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Microphonics</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_ratecounters</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Software Telemetry</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_rdr_sum</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Spectral Sum</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_shield_counter</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Anti-Coincidence Shield</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_shield_spectra</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Shield Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_shield_spectra2</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Shield Spectra 2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_grs_status</name>
    <description>MESSENGER at Venus — Gamma Ray Spectrometer PDS4 Telemetry Status</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mascs_uvvcdr</name>
    <description>MESSENGER at Venus — MERCURY ATMOSPHERIC AND SURFACE COMPOSITION SPECTROMETER PDS3 UVVS Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mascs_uvvedr</name>
    <description>MESSENGER at Venus — MERCURY ATMOSPHERIC AND SURFACE COMPOSITION SPECTROMETER PDS3 UVVS Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mascs_vircdr</name>
    <description>MESSENGER at Venus — MERCURY ATMOSPHERIC AND SURFACE COMPOSITION SPECTROMETER PDS3 VIRS Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mascs_viredr</name>
    <description>MESSENGER at Venus — MERCURY ATMOSPHERIC AND SURFACE COMPOSITION SPECTROMETER PDS3 VIRS Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mdis_nac_cdrnac</name>
    <description>MESSENGER at Venus — Mercury Dual Imaging System - Narrow Angle Camera PDS4 Narrow-Angle Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mdis_nac_edrnac</name>
    <description>MESSENGER at Venus — Mercury Dual Imaging System - Narrow Angle Camera PDS4 Narrow-Angle Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mdis_wac_cdrwac</name>
    <description>MESSENGER at Venus — Mercury Dual Imaging System - Wide Angle Camera PDS4 Wide-Angle Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mdis_wac_edrwac</name>
    <description>MESSENGER at Venus — Mercury Dual Imaging System - Wide Angle Camera PDS4 Wide-Angle Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mla_hdiagnostic</name>
    <description>MESSENGER at Venus — Mercury Laser Altimeter PDS4 Hardware Diagnostic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mla_hdiagnosticcdr</name>
    <description>MESSENGER at Venus — Mercury Laser Altimeter PDS4 Hardware Diagnostic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mla_radr</name>
    <description>MESSENGER at Venus — Mercury Laser Altimeter PDS4 Geolocated Radiometric</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mla_scicdr</name>
    <description>MESSENGER at Venus — Mercury Laser Altimeter PDS4 Science</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mla_sciedr</name>
    <description>MESSENGER at Venus — Mercury Laser Altimeter PDS4 Science</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mla_scigdr</name>
    <description>MESSENGER at Venus — Mercury Laser Altimeter PDS4 Gridded Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mla_scirdrv1</name>
    <description>MESSENGER at Venus — Mercury Laser Altimeter PDS4 Geolocated Science V1</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mla_scirdrv2</name>
    <description>MESSENGER at Venus — Mercury Laser Altimeter PDS4 Geolocated Science V2</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mla_shadr</name>
    <description>MESSENGER at Venus — Mercury Laser Altimeter PDS4 Spherical Harmonics ASCII</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mla_status</name>
    <description>MESSENGER at Venus — Mercury Laser Altimeter PDS4 Engineering</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_mla_statuscdr</name>
    <description>MESSENGER at Venus — Mercury Laser Altimeter PDS4 Engineering</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_cdr_counts</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Counter</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_cdr_eng</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Engineering</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_cdr_gamma_burst</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Gamma Burst</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_cdr_gcr_spectra</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Galactic Cosmic Ray Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_cdr_spectra</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_ddr_ncp</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Neutron Count Rate</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_ddr_ncr</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Relative Neutron Count Rate</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_raw_calibration</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Calibration and Diagnostic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_raw_command</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Command</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_raw_counts</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Time-Correlated Counts</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_raw_events</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Event Mode</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_raw_full_spectra</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Full Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_raw_gamma_burst</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Gamma Burst</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_raw_gcr_spectra</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Galactic Cosmic Ray Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_raw_short_science</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Short Science Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_raw_spectra</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_ns_raw_status</name>
    <description>MESSENGER at Venus — Neutron Spectrometer PDS4 Telemetry Status</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_rss_tnf4</name>
    <description>MESSENGER at Venus — Radio Science Subsystem PDS4 Tracking and Navigation File (TRK-2-34 data) Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_xrs_command</name>
    <description>MESSENGER at Venus — X-Ray Spectrometer PDS4 Command</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_xrs_edr</name>
    <description>MESSENGER at Venus — X-Ray Spectrometer PDS4 Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_xrs_footprint</name>
    <description>MESSENGER at Venus — X-Ray Spectrometer PDS4 Footprint</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_xrs_rdrmap</name>
    <description>MESSENGER at Venus — X-Ray Spectrometer PDS4 Map</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_messenger_xrs_xrscdr</name>
    <description>MESSENGER at Venus — X-Ray Spectrometer PDS4 Spectra</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_adf</name>
    <description>Magellan — Radar System PDS4 ARCDR Altimetry Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_altedr</name>
    <description>Magellan — Radar System PDS3 Altimeter Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_anf</name>
    <description>Magellan — Radar System PDS4 SCVDR Altimetry Inversion File</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_c1midr</name>
    <description>Magellan — Radar System PDS4 Compressed-Resolution MIDR</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_c2midr</name>
    <description>Magellan — Radar System PDS4 Twice Compressed-Resolution MIDR</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_c3midr</name>
    <description>Magellan — Radar System PDS4 Three Times Compressed-Resolution MIDR</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_cbidr</name>
    <description>Magellan — Radar System PDS3 Compressed Basic Image Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_edf</name>
    <description>Magellan — Radar System PDS4 SCVDR Emissivity Data File</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_fbidr</name>
    <description>Magellan — Radar System PDS3 Full-Resolution Basic Image Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_fmap</name>
    <description>Magellan — Radar System PDS3 Full Resolution Radar Mosaic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_fmidr</name>
    <description>Magellan — Radar System PDS4 Full-Resolution Mosaicked Image Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_gedr</name>
    <description>Magellan — Radar System PDS4 Global Emissivity Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_gredr</name>
    <description>Magellan — Radar System PDS4 Global Reflectivity Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_gsdr</name>
    <description>Magellan — Radar System PDS4 Global Slope Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_gtdr</name>
    <description>Magellan — Radar System PDS4 Global Topography Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_gvdr</name>
    <description>Magellan — Radar System PDS4 Global Vector Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_gxdr</name>
    <description>Magellan — Radar System PDS4 Global Map Data Products</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_nff</name>
    <description>Magellan — Radar System PDS4 SCVDR Altimetry Inversion Fit File</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_ohf</name>
    <description>Magellan — Radar System PDS4 SCVDR Orbit Header File</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_oif</name>
    <description>Magellan — Radar System PDS4 SCVDR Oblique Sinusoidal Image File</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_pmidr</name>
    <description>Magellan — Radar System PDS4 Polar Stereographic Mosaicked Image Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_rdf</name>
    <description>Magellan — Radar System PDS4 ARCDR Radiometry Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_sif</name>
    <description>Magellan — Radar System PDS4 SCVDR Sinusoidal Image File</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rdrs_topmos</name>
    <description>Magellan — Radar System PDS4 Magellan Stereo-Derived Topography Mosaic</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_bsp</name>
    <description>Magellan — Radio Science Subsystem PDS4 Binary Spacecraft and Planetary Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_gnc</name>
    <description>Magellan — Radio Science Subsystem PDS4 RSS Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_gravdat</name>
    <description>Magellan — Radio Science Subsystem PDS4 Gravity and Spherical Harmonic Data</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_gravimg</name>
    <description>Magellan — Radio Science Subsystem PDS4 Gravity Images</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_losapdr</name>
    <description>Magellan — Radio Science Subsystem PDS4 Line of Sight Acceleration Profile Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_odr</name>
    <description>Magellan — Radio Science Subsystem PDS3 Original Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_prr</name>
    <description>Magellan — Radio Science Subsystem PDS4 RSS Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_prt</name>
    <description>Magellan — Radio Science Subsystem PDS4 RSS Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_rocabs</name>
    <description>Magellan — Radio Science Subsystem PDS3 Radio Occultation Atmospheric Profile Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_rocodr</name>
    <description>Magellan — Radio Science Subsystem PDS3 Radio Occulation Original Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_rocrtp</name>
    <description>Magellan — Radio Science Subsystem PDS3 Radio Occultation Atmospheric Profile Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_roctdf</name>
    <description>Magellan — Radio Science Subsystem PDS3 Radio Occultation Tracking Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_sc1</name>
    <description>Magellan — Radio Science Subsystem PDS4 RSS Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_sc2</name>
    <description>Magellan — Radio Science Subsystem PDS4 RSS Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_spc</name>
    <description>Magellan — Radio Science Subsystem PDS4 RSS Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_srf</name>
    <description>Magellan — Radio Science Subsystem PDS4 RSS Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_srg</name>
    <description>Magellan — Radio Science Subsystem PDS4 RSS Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_tdf</name>
    <description>Magellan — Radio Science Subsystem PDS3 Tracking Data File</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_mgn_rss_topo</name>
    <description>Magellan — Radio Science Subsystem PDS4 Topo. Maps, Planetary Radius, Harmonic Coeff.</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_mag_edr</name>
    <description>ESA's Venus Express — Magnetometer PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_mag_rdr</name>
    <description>ESA's Venus Express — Magnetometer PDS3 Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_mag_refdr</name>
    <description>ESA's Venus Express — Magnetometer PDS3 Resampled Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_virtis_edr</name>
    <description>ESA's Venus Express — Visible and Infrared Thermal Imaging Spectrometer PDS3 Experiment Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_virtis_rdr</name>
    <description>ESA's Venus Express — Visible and Infrared Thermal Imaging Spectrometer PDS3 Calibrated Data Record</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_vmc_rdracl</name>
    <description>ESA's Venus Express — Visual Monitoring Camera PDS3 RDR Atmospheric Composition and Chemistry of the Lower Atmosphere</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_vmc_rdracm</name>
    <description>ESA's Venus Express — Visual Monitoring Camera PDS3 RDR Atmospheric Composition and Chemistry of the Middle Atmosphere</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_vmc_rdradmg</name>
    <description>ESA's Venus Express — Visual Monitoring Camera PDS3 RDR Atmospheric Dynamics of the Middle Atmosphere: Sco. Global Circulation</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_vmc_rdradmp</name>
    <description>ESA's Venus Express — Visual Monitoring Camera PDS3 RDR Atmospheric Dynamics of the Middle Atmosphere: Sco. Polar Phenomena</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_vmc_rdradms</name>
    <description>ESA's Venus Express — Visual Monitoring Camera PDS3 RDR Atmospheric Dynamics of the Middle Atmosphere: Sco. Small Scale Dynamics and Wave Phenomena</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_vmc_rdrcl</name>
    <description>ESA's Venus Express — Visual Monitoring Camera PDS3 Cloud Layer and Hazes</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>ode_venus_vex_vmc_rdrsf</name>
    <description>ESA's Venus Express — Visual Monitoring Camera PDS3 RDR Surface Properties and Geology</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>rosetta_anaglyphs</name>
    <description>Rosetta OSIRIS Anaglyphs of Comet 67P/Churyumov-Gerasimenko</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_host_name</name>
      <ucd>meta.id;instr.obsty</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>measurement_type</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1_resol</name>
      <description>Ground sample distance (same source as c2_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2_resol</name>
      <description>Ground sample distance (same source as c1_resol).</description>
      <unit>m</unit>
      <ucd>pos.resolution</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>bib_reference</name>
      <ucd>meta.bib.doi</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>incidence_min</name>
      <description>Incidence angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>incidence_max</name>
      <unit>deg</unit>
      <ucd>pos.incidenceAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_min</name>
      <description>Phase angle (single value in this catalog, reused for min and max).</description>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>phase_max</name>
      <unit>deg</unit>
      <ucd>pos.phaseAng;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>sun_distance</name>
      <ucd>pos.distance;pos.heliocentric</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_coordinate_description</name>
      <description>IAU CRS name/code.</description>
      <ucd>meta.code.class;pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>pixelscale</name>
      <unit>km/pix</unit>
      <ucd>instr.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>map_scale</name>
      <ucd>pos.wcs.scale</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>publisher</name>
      <description>Name of the collection's "host" provider.</description>
      <ucd>meta.curation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  <table xsi:type="vs:Table">
    <name>vim_cassini_vims_ir</name>
    <description>Cassini VIMS-IR STAC catalog</description>
    <column>
      <name>granule_uid</name>
      <description>STAC item identifier.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>service_title</name>
      <description>Title of resource = schema name (EPN-TAP2 mandatory, fixed value -- keep this in sync with service.title above).
</description>
      <ucd>meta.title</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>granule_gid</name>
      <description>STAC collection id (this item's granule group).</description>
      <ucd>meta.id;meta.dataset</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>obs_id</name>
      <description>PDS logical identifier of the product, when available.</description>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_name</name>
      <description>Observed target (ssys:targets is a list; first entry is used).</description>
      <ucd>meta.id;src</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_class</name>
      <ucd>meta.code.class;src.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_min</name>
      <description>Start time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.start</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>time_max</name>
      <description>End time of the observation (Julian Date).</description>
      <unit>d</unit>
      <ucd>time.end</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>instrument_name</name>
      <description>Instrument (instruments is a list; first entry is used).</description>
      <ucd>meta.id;instr</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>dataproduct_type</name>
      <ucd>meta.code.class</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>processing_level</name>
      <ucd>meta.code</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>creation_date</name>
      <ucd>time.creation</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>file_name</name>
      <description>Title of the data asset (largest asset whose roles include "data").</description>
      <ucd>meta.id;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_url</name>
      <description>STAC assets are keyed by a per-item file name, not a fixed key, so the converter is handed the whole assets dict and picks the data file itself (largest asset with roles containing "data").
</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_format</name>
      <ucd>meta.code.mime</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_estsize</name>
      <unit>byte</unit>
      <ucd>phys.size;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType">long</dataType>
    </column>
    <column>
      <name>s_region</name>
      <description>Footprint, used for CONTAINS()/INTERSECTS() spatial predicates.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>spatial_frame_type</name>
      <description>Always "body" for this proxy -- a fixed value, not read from STAC (see the `constant` config option instead of `stac_path`).
</description>
      <ucd>pos.frame</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>thumbnail_url</name>
      <description>href of the asset whose roles include "thumbnail".</description>
      <ucd>meta.ref.url;meta.preview</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>external_link</name>
      <description>href of the asset whose roles include "metadata".</description>
      <ucd>meta.ref.url</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>modification_date</name>
      <ucd>time.update</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>release_date</name>
      <ucd>time.release</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>time_refposition</name>
      <ucd>meta.id</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>c1min</name>
      <description>Minimum longitude of the footprint. UCD per EPN-TAP2 table 2 for spatial_frame_type=body.
</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c1max</name>
      <description>Maximum longitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lon;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2min</name>
      <description>Minimum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.min</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>c2max</name>
      <description>Maximum latitude of the footprint.</description>
      <unit>deg</unit>
      <ucd>pos.bodyrc.lat;stat.max</ucd>
      <dataType xsi:type="vs:VOTableType">double</dataType>
    </column>
    <column>
      <name>filter</name>
      <description>Name of the first entry of properties.bands, if present.</description>
      <ucd>meta.id;instr.filter</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>target_region</name>
      <description>Lower-cased first entry of ssys:targets (UAT vocabulary term).</description>
      <ucd>meta.id;src;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>access_md5</name>
      <description>MD5/checksum of the primary data asset, when available.</description>
      <ucd>meta.checksum;meta.file</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
    <column>
      <name>coverage</name>
      <description>href of a MOC/HEALPix coverage asset (PDSSP convention), when present.</description>
      <ucd>pos.outline;obs.field</ucd>
      <dataType xsi:type="vs:VOTableType" arraysize="*">char</dataType>
    </column>
  </table>
  </schema>
</vosi:tableset>
