<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.18">
<meta name="author" content="René Ferdinand Rivera Morell">
<meta name="copyright" content="Copyright 2022 René Ferdinand Rivera Morell">
<title>Tool Introspection</title>
<style>
@import url(https://fonts.googleapis.com/css?family=Varela+Round|Open+Sans:400italic,600italic,400,600|Ubuntu+Mono:400);
/*! normalize.css v2.1.2 | MIT License | git.io/normalize */
/* ========================================================================== HTML5 display definitions ========================================================================== */
/** Correct `block` display not defined in IE 8/9. */
article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; }

/** Correct `inline-block` display not defined in IE 8/9. */
audio, canvas, video { display: inline-block; }

/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */
audio:not([controls]) { display: none; height: 0; }

/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` element in IE, Safari, and Firefox < 22. */
[hidden], template { display: none; }

script { display: none !important; }

/* ========================================================================== Base ========================================================================== */
/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */
html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ }

/** Remove default margin. */
body { margin: 0; }

/* ========================================================================== Links ========================================================================== */
/** Remove the gray background color from active links in IE 10. */
a { background: transparent; }

/** Address `outline` inconsistency between Chrome and other browsers. */
a:focus { outline: thin dotted; }

/** Improve readability when focused and also mouse hovered in all browsers. */
a:active, a:hover { outline: 0; }

/* ========================================================================== Typography ========================================================================== */
/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */
h1 { font-size: 2em; margin: 0.67em 0; }

/** Address styling not present in IE 8/9, Safari 5, and Chrome. */
abbr[title] { border-bottom: 1px dotted; }

/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */
b, strong { font-weight: bold; }

/** Address styling not present in Safari 5 and Chrome. */
dfn { font-style: italic; }

/** Address differences between Firefox and other browsers. */
hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; }

/** Address styling not present in IE 8/9. */
mark { background: #ff0; color: #000; }

/** Correct font family set oddly in Safari 5 and Chrome. */
code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; }

/** Improve readability of pre-formatted text in all browsers. */
pre { white-space: pre-wrap; }

/** Set consistent quote types. */
q { quotes: "\201C" "\201D" "\2018" "\2019"; }

/** Address inconsistent and variable font size in all browsers. */
small { font-size: 80%; }

/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }

sup { top: -0.5em; }

sub { bottom: -0.25em; }

/* ========================================================================== Embedded content ========================================================================== */
/** Remove border when inside `a` element in IE 8/9. */
img { border: 0; }

/** Correct overflow displayed oddly in IE 9. */
svg:not(:root) { overflow: hidden; }

/* ========================================================================== Figures ========================================================================== */
/** Address margin not present in IE 8/9 and Safari 5. */
figure { margin: 0; }

/* ========================================================================== Forms ========================================================================== */
/** Define consistent border, margin, and padding. */
fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; }

/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */
legend { border: 0; /* 1 */ padding: 0; /* 2 */ }

/** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */
button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ }

/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */
button, input { line-height: normal; }

/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */
button, select { text-transform: none; }

/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */
button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ }

/** Re-set default cursor for disabled elements. */
button[disabled], html input[disabled] { cursor: default; }

/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */
input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ }

/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */
input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; }

/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */
input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }

/** Remove inner padding and border in Firefox 4+. */
button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }

/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */
textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ }

/* ========================================================================== Tables ========================================================================== */
/** Remove most spacing between table cells. */
table { border-collapse: collapse; border-spacing: 0; }

meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; width: 768px; }

meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; width: 1280px; }

meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; width: 1440px; }

*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }

html, body { font-size: 100%; }

body { background: #fefdfd; color: rgba(0, 0, 0, 0.8); padding: 0; margin: 0; font-family: "Open Sans", sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; }

a:hover { cursor: pointer; }

img, object, embed { max-width: 100%; height: auto; }

object, embed { height: 100%; }

img { -ms-interpolation-mode: bicubic; }

#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; }

.left { float: left !important; }

.right { float: right !important; }

.text-left { text-align: left !important; }

.text-right { text-align: right !important; }

.text-center { text-align: center !important; }

.text-justify { text-align: justify !important; }

.hide { display: none; }

.antialiased { -webkit-font-smoothing: antialiased; }

img { display: inline-block; vertical-align: middle; }

textarea { height: auto; min-height: 50px; }

select { width: 100%; }

p.lead { font-size: 1.21875em; line-height: 1.6; }

.subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { line-height: 1.25; color: #002c5e; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; }

/* Typography resets */
div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; }

/* Default Link Styles */
a { color: #005580; text-decoration: underline; line-height: inherit; }
a:hover, a:focus { color: #078d71; }
a img { border: none; }

/* Default paragraph styles */
p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 1.5; margin-bottom: 1.25em; text-rendering: optimizeLegibility; }
p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; }

/* Default header styles */
h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: "Varela Round", sans-serif; font-weight: 400; font-style: normal; color: #00326b; text-rendering: optimizeLegibility; margin-top: 0.8em; margin-bottom: 0.5em; line-height: 1.0625em; }
h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #057aff; line-height: 0; }

h1 { font-size: 2.125em; }

h2 { font-size: 1.6875em; }

h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; }

h4 { font-size: 1.125em; }

h5 { font-size: 1.125em; }

h6 { font-size: 1em; }

hr { border: solid rgba(145, 135, 84, 0.15); border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; }

/* Helpful Typography Defaults */
em, i { font-style: italic; line-height: inherit; }

strong, b { font-weight: bold; line-height: inherit; }

small { font-size: 60%; line-height: inherit; }

code { font-family: "Ubuntu Mono", "Inconsolata", monospace; font-weight: 400; color: #331d00; }

/* Lists */
ul, ol, dl { font-size: 1em; line-height: 1.5; margin-bottom: 1.25em; list-style-position: outside; font-family: inherit; }

ul, ol { margin-left: 1.5em; }
ul.no-bullet, ol.no-bullet { margin-left: 1.5em; }

/* Unordered Lists */
ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* Override nested font-size change */ }
ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; }
ul.square { list-style-type: square; }
ul.circle { list-style-type: circle; }
ul.disc { list-style-type: disc; }
ul.no-bullet { list-style: none; }

/* Ordered Lists */
ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; }

/* Definition Lists */
dl dt { margin-bottom: 0.3125em; font-weight: bold; }
dl dd { margin-bottom: 1.25em; }

/* Abbreviations */
abbr, acronym { text-transform: uppercase; font-size: 90%; color: rgba(0, 0, 0, 0.8); border-bottom: 1px dotted #ddd; cursor: help; }

abbr { text-transform: none; }

/* Blockquotes */
blockquote { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #ddd; }
blockquote cite { display: block; font-size: 0.8125em; color: #666; }
blockquote cite:before { content: "\2014 \0020"; }
blockquote cite a, blockquote cite a:visited { color: #666; }

blockquote, blockquote p { line-height: 1.5; color: #999; }

/* Microformats */
.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #ddd; padding: 0.625em 0.75em; }
.vcard li { margin: 0; display: block; }
.vcard .fn { font-weight: bold; font-size: 0.9375em; }

.vevent .summary { font-weight: bold; }
.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; }

@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.25; }
  h1 { font-size: 2.75em; }
  h2 { font-size: 2.3125em; }
  h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; }
  h4 { font-size: 1.4375em; } }
/* Tables */
table { background: #fff; margin-bottom: 1.25em; border: solid 1px rgba(145, 135, 84, 0.15); }
table thead, table tfoot { background: rgba(119, 84, 22, 0.1); font-weight: bold; }
table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: rgba(0, 0, 0, 0.8); text-align: left; }
table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: rgba(0, 0, 0, 0.8); }
table tr.even, table tr.alt, table tr:nth-of-type(even) { background: rgba(119, 84, 22, 0.025); }
table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.5; }

body { tab-size: 4; word-wrap: anywhere; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; }

table { word-wrap: normal; }

h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.25; }

object, svg { display: inline-block; vertical-align: middle; }

.center { margin-left: auto; margin-right: auto; }

.stretch { width: 100%; }

.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; }
.clearfix:after, .float-group:after { clear: both; }

:not(pre).nobreak { word-wrap: normal; }
:not(pre).nowrap { white-space: nowrap; }
:not(pre).pre-wrap { white-space: pre-wrap; }

:not(pre):not([class^=L]) > code { font-size: 1.0625em; font-style: normal !important; letter-spacing: 0; padding: 0; line-height: 1.25; }

pre { color: inherit; font-family: "Liberation Mono", "Consolas", monospace; line-height: 1.4; }
pre code, pre pre { color: inherit; font-size: inherit; line-height: inherit; }
pre > code { display: block; }

pre.nowrap, pre.nowrap pre { white-space: pre; word-wrap: normal; }

em em { font-style: normal; }

strong strong { font-weight: normal; }

.keyseq { color: rgba(51, 51, 51, 0.8); }

kbd { font-family: "Ubuntu Mono", "Inconsolata", monospace; display: inline-block; color: rgba(0, 0, 0, 0.8); font-size: 0.65em; line-height: 1.45; background-color: #f7f7f7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; margin: 0 0.15em; padding: 0.2em 0.5em; vertical-align: middle; position: relative; top: -0.1em; white-space: nowrap; }

.keyseq kbd:first-child { margin-left: 0; }

.keyseq kbd:last-child { margin-right: 0; }

.menuseq, .menuref { color: #000; }

.menuseq b:not(.caret), .menuref { font-weight: inherit; }

.menuseq { word-spacing: -0.02em; }
.menuseq b.caret { font-size: 1.25em; line-height: 0.8; }
.menuseq i.caret { font-weight: bold; text-align: center; width: 0.45em; }

b.button:before, b.button:after { position: relative; top: -1px; font-weight: normal; }

b.button:before { content: "["; padding: 0 3px 0 2px; }

b.button:after { content: "]"; padding: 0 2px 0 3px; }

p a > code:hover { color: #1a0f00; }

#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; }
#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; }
#header:after, #content:after, #footnotes:after, #footer:after { clear: both; }

#content { margin-top: 1.25em; }

#content:before { content: none; }

#header > h1:first-child { color: #703f1c; margin-top: 2.25rem; margin-bottom: 0; }
#header > h1:first-child + #toc { margin-top: 8px; border-top: 1px solid rgba(145, 135, 84, 0.15); }
#header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { border-bottom: 1px solid rgba(145, 135, 84, 0.15); padding-bottom: 8px; }
#header .details { border-bottom: 1px solid rgba(145, 135, 84, 0.15); line-height: 1.45; padding-top: 0.25em; padding-bottom: 0.25em; padding-left: 0.25em; color: #666; display: -ms-flexbox; display: -webkit-flex; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; }
#header .details span:first-child { margin-left: -0.125em; }
#header .details span.email a { color: #999; }
#header .details br { display: none; }
#header .details br + span:before { content: "\00a0\2013\00a0"; }
#header .details br + span.author:before { content: "\00a0\22c5\00a0"; color: #999; }
#header .details br + span#revremark:before { content: "\00a0|\00a0"; }
#header #revnumber { text-transform: capitalize; }
#header #revnumber:after { content: "\00a0"; }

#content > h1:first-child:not([class]) { color: #703f1c; border-bottom: 1px solid rgba(145, 135, 84, 0.15); padding-bottom: 8px; margin-top: 0; padding-top: 1rem; margin-bottom: 1.25rem; }

#toc { border-bottom: 0px solid #ddd; padding-bottom: 0.5em; }
#toc > ul { margin-left: 0.125em; }
#toc ul.sectlevel0 > li > a { font-style: italic; }
#toc ul.sectlevel0 ul.sectlevel1 { margin: 0.5em 0; }
#toc ul { font-family: "Varela Round", sans-serif; list-style-type: none; }
#toc li { line-height: 1.3334; margin-top: 0.3334em; }
#toc a { text-decoration: none; }
#toc a:active { text-decoration: underline; }

#toctitle { color: #002c5e; font-size: 1.2em; }

@media only screen and (min-width: 768px) { #toctitle { font-size: 1.375em; }
  body.toc2 { padding-left: 15em; padding-right: 0; }
  #toc.toc2 { margin-top: 0 !important; background: #f2f2f4; position: fixed; width: 15em; left: 0; top: 0; border-right: 1px solid #ddd; border-top-width: 0 !important; border-bottom-width: 0 !important; z-index: 1000; padding: 1.25em 1em; height: 100%; overflow: auto; }
  #toc.toc2 #toctitle { margin-top: 0; margin-bottom: 0.8rem; font-size: 1.2em; }
  #toc.toc2 > ul { font-size: 0.9em; margin-bottom: 0; }
  #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; }
  #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; }
  body.toc2.toc-right { padding-left: 0; padding-right: 15em; }
  body.toc2.toc-right #toc.toc2 { border-right-width: 0; border-left: 1px solid #ddd; left: auto; right: 0; } }
@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; padding-right: 0; }
  #toc.toc2 { width: 20em; }
  #toc.toc2 #toctitle { font-size: 1.375em; }
  #toc.toc2 > ul { font-size: 0.95em; }
  #toc.toc2 ul ul { padding-left: 1.25em; }
  body.toc2.toc-right { padding-left: 0; padding-right: 20em; } }
#content #toc { border-style: solid; border-width: 1px; border-color: #d6d6dd; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f4; -webkit-border-radius: 6px; border-radius: 6px; }
#content #toc > :first-child { margin-top: 0; }
#content #toc > :last-child { margin-bottom: 0; }

#footer { max-width: none; background: #0b445a; padding: 1.25em; }

#footer-text { color: #fefdfd; line-height: 1.35; }

#content { margin-bottom: 0.625em; }

.sect1 { padding-bottom: 0.625em; }

@media only screen and (min-width: 768px) { #content { margin-bottom: 1.25em; }
  .sect1 { padding-bottom: 1.25em; } }
.sect1:last-child { padding-bottom: 0; }

.sect1 + .sect1 { border-top: 0px solid #ddd; }

#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; z-index: 1001; width: 1.5ex; margin-left: -1.5ex; display: block; text-decoration: none !important; visibility: hidden; text-align: center; font-weight: normal; }
#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: "\00A7"; font-size: 0.85em; display: block; padding-top: 0.1em; }
#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; }
#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: #00326b; text-decoration: none; }
#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #002652; }

details, .audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { margin-bottom: 1.25em; }

details > summary:first-of-type { cursor: pointer; display: list-item; outline: none; margin-bottom: 0.75em; }

.admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-rendering: optimizeLegibility; text-align: left; }

table.tableblock.fit-content > caption.title { white-space: nowrap; width: 0; }

.paragraph.lead > p, #preamble > .sectionbody > [class="paragraph"]:first-of-type p { font-size: 1.21875em; line-height: 1.6; color: #703f1c; }

table.tableblock #preamble > .sectionbody > [class="paragraph"]:first-of-type p { font-size: inherit; }

.admonitionblock > table { border-collapse: separate; border: 0; background: none; width: 100%; }
.admonitionblock > table td.icon { text-align: center; width: 80px; }
.admonitionblock > table td.icon img { max-width: none; }
.admonitionblock > table td.icon .title { font-weight: bold; font-family: "Varela Round", sans-serif; text-transform: uppercase; }
.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid rgba(145, 135, 84, 0.15); color: #666; word-wrap: anywhere; }
.admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; }

.exampleblock > .content { border-style: solid; border-width: 1px; border-color: #eddbdb; margin-bottom: 1.25em; padding: 1.25em; background: #fefdfd; -webkit-border-radius: 6px; border-radius: 6px; }
.exampleblock > .content > :first-child { margin-top: 0; }
.exampleblock > .content > :last-child { margin-bottom: 0; }

.sidebarblock { border-style: solid; border-width: 1px; border-color: #d1d1d8; margin-bottom: 1.25em; padding: 1.25em; background: #ececef; -webkit-border-radius: 6px; border-radius: 6px; }
.sidebarblock > :first-child { margin-top: 0; }
.sidebarblock > :last-child { margin-bottom: 0; }
.sidebarblock > .content > .title { color: #002c5e; margin-top: 0; }

.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; }

.literalblock pre, .listingblock > .content > pre { border: 1px solid rgba(16, 195, 196, 0.125); -webkit-border-radius: 6px; border-radius: 6px; overflow-x: auto; padding: 1em; font-size: 0.8125em; }
@media only screen and (min-width: 768px) { .literalblock pre, .listingblock > .content > pre { font-size: 0.90625em; } }
@media only screen and (min-width: 1280px) { .literalblock pre, .listingblock > .content > pre { font-size: 1em; } }

.literalblock pre, .listingblock > .content > pre:not(.highlight), .listingblock > .content > pre[class="highlight"], .listingblock > .content > pre[class^="highlight "] { background: rgba(16, 195, 196, 0.05); }

.literalblock.output pre { color: rgba(16, 195, 196, 0.05); background-color: inherit; }

.listingblock > .content { position: relative; }

.listingblock code[data-lang]:before { display: none; content: attr(data-lang); position: absolute; font-size: 0.75em; top: 0.425rem; right: 0.5rem; line-height: 1; text-transform: uppercase; color: inherit; opacity: 0.5; }

.listingblock:hover code[data-lang]:before { display: block; }

.listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: inherit; opacity: 0.5; }

.listingblock.terminal pre .command:not([data-prompt]):before { content: "$"; }

.listingblock pre.highlightjs { padding: 0; }
.listingblock pre.highlightjs > code { padding: 1em; -webkit-border-radius: 6px; border-radius: 6px; }

.prettyprint { background: rgba(16, 195, 196, 0.05); }

pre.prettyprint .linenums { line-height: 1.4; margin-left: 2em; }

pre.prettyprint li { background: none; list-style-type: inherit; padding-left: 0; }

pre.prettyprint li code[data-lang]:before { opacity: 1; }

pre.prettyprint li:not(:first-child) code[data-lang]:before { display: none; }

table.linenotable { border-collapse: separate; border: 0; margin-bottom: 0; background: none; }
table.linenotable td[class] { color: inherit; vertical-align: top; padding: 0; line-height: inherit; white-space: normal; }
table.linenotable td.code { padding-left: 0.75em; }
table.linenotable td.linenos { border-right: 1px solid currentColor; opacity: 0.35; padding-right: 0.5em; }

pre.pygments .lineno { border-right: 1px solid currentColor; opacity: 0.35; display: inline-block; margin-right: 0.75em; }
pre.pygments .lineno:before { content: ""; margin-right: -0.125em; }

.quoteblock { margin: 0 1em 1.25em 1.5em; display: table; }
.quoteblock:not(.excerpt) > .title { margin-left: -1.5em; margin-bottom: 0.75em; }
.quoteblock blockquote, .quoteblock p { color: #999; font-size: 1.15rem; line-height: 1.75; word-spacing: 0.1em; letter-spacing: 0; font-style: italic; text-align: justify; }
.quoteblock blockquote { margin: 0; padding: 0; border: 0; }
.quoteblock blockquote:before { content: "\201c"; float: left; font-size: 2.75em; font-weight: bold; line-height: 0.6em; margin-left: -0.6em; color: #002c5e; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); }
.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; }
.quoteblock .attribution { margin-top: 0.75em; margin-right: 0.5ex; text-align: right; }

.verseblock { margin: 0 1em 1.25em 1em; }
.verseblock pre { font-family: "Open Sans", "DejaVu Sans", sans; font-size: 1.15rem; color: #999; font-weight: 300; text-rendering: optimizeLegibility; }
.verseblock pre strong { font-weight: 400; }
.verseblock .attribution { margin-top: 1.25rem; margin-left: 0.5ex; }

.quoteblock .attribution, .verseblock .attribution { font-size: 0.8125em; line-height: 1.45; font-style: italic; }
.quoteblock .attribution br, .verseblock .attribution br { display: none; }
.quoteblock .attribution cite, .verseblock .attribution cite { display: block; letter-spacing: -0.025em; color: #666; }

.quoteblock.abstract blockquote:before, .quoteblock.excerpt blockquote:before, .quoteblock .quoteblock blockquote:before { display: none; }
.quoteblock.abstract blockquote, .quoteblock.abstract p, .quoteblock.excerpt blockquote, .quoteblock.excerpt p, .quoteblock .quoteblock blockquote, .quoteblock .quoteblock p { line-height: 1.6; word-spacing: 0; }
.quoteblock.abstract { margin: 0 1em 1.25em 1em; display: block; }
.quoteblock.abstract > .title { margin: 0 0 0.375em 0; font-size: 1.15em; text-align: center; }
.quoteblock.excerpt > blockquote, .quoteblock .quoteblock { padding: 0 0 0.25em 1em; border-left: 0.25em solid rgba(145, 135, 84, 0.15); }
.quoteblock.excerpt, .quoteblock .quoteblock { margin-left: 0; }
.quoteblock.excerpt blockquote, .quoteblock.excerpt p, .quoteblock .quoteblock blockquote, .quoteblock .quoteblock p { color: inherit; font-size: 1.0625rem; }
.quoteblock.excerpt .attribution, .quoteblock .quoteblock .attribution { color: inherit; text-align: left; margin-right: 0; }

p.tableblock:last-child { margin-bottom: 0; }

td.tableblock > .content { margin-bottom: 1.25em; word-wrap: anywhere; }
td.tableblock > .content > :last-child { margin-bottom: -1.25em; }

table.tableblock, th.tableblock, td.tableblock { border: 0 solid rgba(145, 135, 84, 0.15); }

table.grid-all > * > tr > * { border-width: 1px; }

table.grid-cols > * > tr > * { border-width: 0 1px; }

table.grid-rows > * > tr > * { border-width: 1px 0; }

table.frame-all { border-width: 1px; }

table.frame-ends { border-width: 1px 0; }

table.frame-sides { border-width: 0 1px; }

table.frame-none > colgroup + * > :first-child > *, table.frame-sides > colgroup + * > :first-child > * { border-top-width: 0; }

table.frame-none > :last-child > :last-child > *, table.frame-sides > :last-child > :last-child > * { border-bottom-width: 0; }

table.frame-none > * > tr > :first-child, table.frame-ends > * > tr > :first-child { border-left-width: 0; }

table.frame-none > * > tr > :last-child, table.frame-ends > * > tr > :last-child { border-right-width: 0; }

table.stripes-all tr, table.stripes-odd tr:nth-of-type(odd), table.stripes-even tr:nth-of-type(even), table.stripes-hover tr:hover { background: rgba(119, 84, 22, 0.025); }

th.halign-left, td.halign-left { text-align: left; }

th.halign-right, td.halign-right { text-align: right; }

th.halign-center, td.halign-center { text-align: center; }

th.valign-top, td.valign-top { vertical-align: top; }

th.valign-bottom, td.valign-bottom { vertical-align: bottom; }

th.valign-middle, td.valign-middle { vertical-align: middle; }

table thead th, table tfoot th { font-weight: bold; }

tbody tr th { display: table-cell; line-height: 1.5; background: rgba(119, 84, 22, 0.1); }

tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: rgba(0, 0, 0, 0.8); font-weight: bold; }

p.tableblock > code:only-child { background: none; padding: 0; }

p.tableblock { font-size: 1em; }

ol { margin-left: 1.75em; }

ul li ol { margin-left: 1.5em; }

dl dd { margin-left: 1.125em; }

dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; }

ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.625em; }

ul.checklist, ul.none, ol.none, ul.no-bullet, ol.no-bullet, ol.unnumbered, ul.unstyled, ol.unstyled { list-style-type: none; }

ul.no-bullet, ol.no-bullet, ol.unnumbered { margin-left: 0.625em; }

ul.unstyled, ol.unstyled { margin-left: 0; }

ul.checklist { margin-left: 0.625em; }

ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child { width: 1.25em; font-size: 0.8em; position: relative; bottom: 0.125em; }

ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; }

ul.inline { display: -ms-flexbox; display: -webkit-box; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; list-style: none; margin: 0 0 0.625em -1.25em; }

ul.inline > li { margin-left: 1.25em; }

.unstyled dl dt { font-weight: normal; font-style: normal; }

ol.arabic { list-style-type: decimal; }

ol.decimal { list-style-type: decimal-leading-zero; }

ol.loweralpha { list-style-type: lower-alpha; }

ol.upperalpha { list-style-type: upper-alpha; }

ol.lowerroman { list-style-type: lower-roman; }

ol.upperroman { list-style-type: upper-roman; }

ol.lowergreek { list-style-type: lower-greek; }

.hdlist > table, .colist > table { border: 0; background: none; }
.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; }

td.hdlist1, td.hdlist2 { vertical-align: top; padding: 0 0.625em; }

td.hdlist1 { font-weight: bold; padding-bottom: 1.25em; }

td.hdlist2 { word-wrap: anywhere; }

.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; }

.colist td:not([class]):first-child { padding: 0.4em 0.75em 0 0.75em; line-height: 1; vertical-align: top; }
.colist td:not([class]):first-child img { max-width: none; }
.colist td:not([class]):last-child { padding: 0.25em 0; }

.thumb, .th { line-height: 0; display: inline-block; border: solid 4px #fff; -webkit-box-shadow: 0 0 0 1px #ddd; box-shadow: 0 0 0 1px #ddd; }

.imageblock.left { margin: 0.25em 0.625em 1.25em 0; }
.imageblock.right { margin: 0.25em 0 1.25em 0.625em; }
.imageblock > .title { margin-bottom: 0; }
.imageblock.thumb, .imageblock.th { border-width: 6px; }
.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; }

.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; }
.image.left { margin-right: 0.625em; }
.image.right { margin-left: 0.625em; }

a.image { text-decoration: none; display: inline-block; }
a.image object { pointer-events: none; }

sup.footnote, sup.footnoteref { font-size: 0.875em; position: static; vertical-align: super; }
sup.footnote a, sup.footnoteref a { text-decoration: none; }
sup.footnote a:active, sup.footnoteref a:active { text-decoration: underline; }

#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; }
#footnotes hr { width: 20%; min-width: 6.25em; margin: -0.25em 0 0.75em 0; border-width: 1px 0 0 0; }
#footnotes .footnote { padding: 0 0.375em 0 0.225em; line-height: 1.3334; font-size: 0.875em; margin-left: 1.2em; margin-bottom: 0.2em; }
#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; margin-left: -1.05em; }
#footnotes .footnote:last-of-type { margin-bottom: 0; }
#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; }

.gist .file-data > table { border: 0; background: #fff; width: 100%; margin-bottom: 0; }
.gist .file-data > table td.line-data { width: 99%; }

div.unbreakable { page-break-inside: avoid; }

.big { font-size: larger; }

.small { font-size: smaller; }

.underline { text-decoration: underline; }

.overline { text-decoration: overline; }

.line-through { text-decoration: line-through; }

.aqua { color: #00bfbf; }

.aqua-background { background-color: #00fafa; }

.black { color: black; }

.black-background { background-color: black; }

.blue { color: #0000bf; }

.blue-background { background-color: #0000fa; }

.fuchsia { color: #bf00bf; }

.fuchsia-background { background-color: #fa00fa; }

.gray { color: #606060; }

.gray-background { background-color: #7d7d7d; }

.green { color: #006000; }

.green-background { background-color: #007d00; }

.lime { color: #00bf00; }

.lime-background { background-color: #00fa00; }

.maroon { color: #600000; }

.maroon-background { background-color: #7d0000; }

.navy { color: #000060; }

.navy-background { background-color: #00007d; }

.olive { color: #606000; }

.olive-background { background-color: #7d7d00; }

.purple { color: #600060; }

.purple-background { background-color: #7d007d; }

.red { color: #bf0000; }

.red-background { background-color: #fa0000; }

.silver { color: #909090; }

.silver-background { background-color: #bcbcbc; }

.teal { color: #006060; }

.teal-background { background-color: #007d7d; }

.white { color: #bfbfbf; }

.white-background { background-color: #fafafa; }

.yellow { color: #bfbf00; }

.yellow-background { background-color: #fafa00; }

span.icon > .fa { cursor: default; }
a span.icon > .fa { cursor: inherit; }

.admonitionblock td.icon [class^="fa icon-"] { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; }
.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #004060; }
.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; }
.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; }
.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; }
.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; }

.conum[data-value] { display: inline-block; color: #fff !important; background-color: rgba(0, 0, 0, 0.8); -webkit-border-radius: 50%; border-radius: 50%; text-align: center; font-size: 0.75em; width: 1.67em; height: 1.67em; line-height: 1.67em; font-family: "Open Sans", "DejaVu Sans", sans-serif; font-style: normal; font-weight: bold; }
.conum[data-value] * { color: #fff !important; }
.conum[data-value] + b { display: none; }
.conum[data-value]:after { content: attr(data-value); }
pre .conum[data-value] { position: relative; top: -0.125em; }

b.conum * { color: inherit !important; }

.conum:not([data-value]):empty { display: none; }

#toc.toc2 ul ul { list-style-type: circle; padding-left: 2em; }

.sect1 { padding-bottom: 0 !important; margin-bottom: 2.5em; }

#header h1 { font-weight: bold; position: relative; left: -0.0625em; }

#content h2, #content h3, #content #toctitle, #content .sidebarblock > .content > .title, #content h4, #content h5, #content #toctitle { position: relative; left: -0.0625em; }
#content h2 { font-weight: bold; }

.paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { color: black; }

pre.pygments.highlight { background-color: rgba(16, 195, 196, 0.05); }

.pygments .tok-err { border: none !important; color: #800000 !important; }

.pygments .tok-c { color: #999 !important; }

</style>
<style>
pre.rouge table td { padding: 5px; }
pre.rouge table pre { margin: 0; }
pre.rouge, pre.rouge .w {
  color: #586e75;
}
pre.rouge .err {
  color: #002b36;
  background-color: #dc322f;
}
pre.rouge .c, pre.rouge .ch, pre.rouge .cd, pre.rouge .cm, pre.rouge .cpf, pre.rouge .c1, pre.rouge .cs {
  color: #657b83;
}
pre.rouge .cp {
  color: #b58900;
}
pre.rouge .nt {
  color: #b58900;
}
pre.rouge .o, pre.rouge .ow {
  color: #93a1a1;
}
pre.rouge .p, pre.rouge .pi {
  color: #93a1a1;
}
pre.rouge .gi {
  color: #859900;
}
pre.rouge .gd {
  color: #dc322f;
}
pre.rouge .gh {
  color: #268bd2;
  background-color: #002b36;
  font-weight: bold;
}
pre.rouge .k, pre.rouge .kn, pre.rouge .kp, pre.rouge .kr, pre.rouge .kv {
  color: #6c71c4;
}
pre.rouge .kc {
  color: #cb4b16;
}
pre.rouge .kt {
  color: #cb4b16;
}
pre.rouge .kd {
  color: #cb4b16;
}
pre.rouge .s, pre.rouge .sb, pre.rouge .sc, pre.rouge .dl, pre.rouge .sd, pre.rouge .s2, pre.rouge .sh, pre.rouge .sx, pre.rouge .s1 {
  color: #859900;
}
pre.rouge .sa {
  color: #6c71c4;
}
pre.rouge .sr {
  color: #2aa198;
}
pre.rouge .si {
  color: #d33682;
}
pre.rouge .se {
  color: #d33682;
}
pre.rouge .nn {
  color: #b58900;
}
pre.rouge .nc {
  color: #b58900;
}
pre.rouge .no {
  color: #b58900;
}
pre.rouge .na {
  color: #268bd2;
}
pre.rouge .m, pre.rouge .mb, pre.rouge .mf, pre.rouge .mh, pre.rouge .mi, pre.rouge .il, pre.rouge .mo, pre.rouge .mx {
  color: #859900;
}
pre.rouge .ss {
  color: #859900;
}
</style>
</head>
<body class="article toc2 toc-left">
<div id="header">
<h1>Tool Introspection</h1>
<div class="details">
<span id="author" class="author">René Ferdinand Rivera Morell</span><br>
<span id="email" class="email"><a href="mailto:grafikrobot@gmail.com">grafikrobot@gmail.com</a></span><br>
<span id="revnumber"> P2717R0,</span>
<span id="revdate">2022-12-16</span>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_abstract">1. Abstract</a></li>
<li><a href="#_revision_history">2. Revision History</a>
<ul class="sectlevel2">
<li><a href="#_revision_0_december_2022">2.1. Revision 0 (December 2022)</a></li>
</ul>
</li>
<li><a href="#_motivation">3. Motivation</a></li>
<li><a href="#_design">4. Design</a>
<ul class="sectlevel2">
<li><a href="#_introspection">4.1. Introspection</a></li>
<li><a href="#_declaration">4.2. Declaration</a></li>
<li><a href="#_capabilities">4.3. Capabilities</a></li>
<li><a href="#_version_specification">4.4. Version Specification</a></li>
<li><a href="#_version_matching">4.5. Version Matching</a></li>
<li><a href="#_format">4.6. Format</a></li>
<li><a href="#_impact_on_the_standard">4.7. Impact On The Standard</a></li>
</ul>
</li>
<li><a href="#_implementation_experience">5. Implementation Experience</a></li>
<li><a href="#_polls">6. Polls</a></li>
<li><a href="#_wording">7. Wording</a>
<ul class="sectlevel2">
<li><a href="#_schema">7.1. Schema</a></li>
</ul>
</li>
<li><a href="#_acknowledgements">8. Acknowledgements</a></li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<style>
.sectionbody > div > .ins {
  border-left: solid 0.4em green;
  padding-left: 1em;
  text-decoration: underline solid green;
  text-underline-offset: 0.3em;
}
.def > .content :first-child {
  margin-left: 0;
}
.def > .content > * {
  margin-left: 3em;
}
.icon .title {
  font-size: 250%;
}
</style>
<div class="dlist">
<dl>
<dt class="hdlist1">Document number: </dt>
<dd>
<p>ISO/IEC/JTC1/SC22/WG21/P2717R0</p>
</dd>
<dt class="hdlist1">Date: </dt>
<dd>
<p>2022-12-16</p>
</dd>
<dt class="hdlist1">Audience: </dt>
<dd>
<p>SG15</p>
</dd>
<dt class="hdlist1">Reply-to: </dt>
<dd>
<p>René Ferdinand Rivera Morell - <em>grafikrobot at gmail dot com</em></p>
</dd>
</dl>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_abstract"><a class="anchor" href="#_abstract"></a>1. Abstract</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We propose to add a mechanism for C&#43;&#43; tools to communicate what capabilities
a tool implements from the Ecosystem IS.
<sup class="footnote" id="_footnote_EcoIS">[<a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_revision_history"><a class="anchor" href="#_revision_history"></a>2. Revision History</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_revision_0_december_2022"><a class="anchor" href="#_revision_0_december_2022"></a>2.1. Revision 0 (December 2022)</h3>
<div class="paragraph">
<p>Initial text.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_motivation"><a class="anchor" href="#_motivation"></a>3. Motivation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>C&#43;&#43; tools will implement the aspects of the Ecosystem IS <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup> that
are relevant to the particular tool. And when they implement those aspects they
may implement a particular edition of them. In order to allow other tools to
adjust their behavior to accommodate such differences we need a mechanism of
introspection for all tools. Additionally when one tool requests to use another
tool&#8217;s Ecosystem IS aspect it&#8217;s desirable to consistently communicate which
edition(s) of that aspect it can use.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_design"><a class="anchor" href="#_design"></a>4. Design</h2>
<div class="sectionbody">
<div class="paragraph">
<p>There are two aspects that this proposal covers:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Introspection</dt>
<dd>
<p>A tool reporting its capabilities to a consumer.</p>
</dd>
<dt class="hdlist1">Declaration</dt>
<dd>
<p>A consumer specifying the capability edition and version.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p><em>Introspection</em> would allow a consumer to ask the target tool if it implements a
particular set of capabilities. The target tool would respond with the range of
capabilities, or nothing, that it supports. With that information the consumer
can go ahead and follow the defined standard, in the Ecosystem IS
<sup class="footnoteref">[<a class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup>, to further interact with the target tool.</p>
</div>
<div class="paragraph">
<p>For <em>declaration</em> a consumer can specify a particular capability and a version
to interact with. And if the target tool recognizes the specification it can
continue to process the consumer&#8217;s use of that capability.</p>
</div>
<div class="paragraph">
<p>Even though these are two separate functions they are by necessity tied to each
other. In order for this pairing to work, and generally for tool
interoperability to work, the tool consumers and target tools must operate on
this minimal pair of functions to bootstrap their interactions. To make that
possible, this design follows some basic tenants:</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Minimal
</td>
<td class="hdlist2">
<p>The interface of the target tool is a single universal command line
argument for each of the two operations.</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Concise
</td>
<td class="hdlist2">
<p>The information communicated to and from the target tool and consumer
is as brief as needed to convey the required information.</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Robust
</td>
<td class="hdlist2">
<p>The interface and information should not result in failure conditions
for either the consumer or target tool. Both ends of the interactions need to
rely on the stability of the interface to then be able to interoperate.</p>
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="_introspection"><a class="anchor" href="#_introspection"></a>4.1. Introspection</h3>
<div class="paragraph">
<p>The consumer can use a single method to query the target tool and obtain all the
capabilities that are available or specifically requested. The following two
use cases are supported:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Unbounded <em>introspection</em> of the available capabilities with a single
valueless <code>--std-info</code> option.</p>
</li>
<li>
<p>Bounded <em>introspection</em> of particular capabilities with a single query valued
<code>--std-info=&lt;VersionSpec&gt;</code> option.</p>
</li>
</ol>
</div>
<div class="sect3">
<h4 id="_unbounded"><a class="anchor" href="#_unbounded"></a>4.1.1. Unbounded</h4>
<div class="paragraph">
<p>An unbounded <em>introspection</em> is the simplest form of obtaining the capabilities.
It is expected that this will be the most commonly used and implemented method
of obtaining this information. It simply returns everything the tool is capable
of doing. This is because it is the easiest to implement for tools. As it&#8217;s
simply having a hard-wired result ready to output when needed. The drawback
though is that the consumer has more information to parse and compare to decide
how to interface with the target tool.</p>
</div>
<div class="paragraph">
<p>Running a tool with the option would look like the following:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="shell"><span class="nv">$ </span>tool <span class="nt">--std-info</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>And could produce this as a JSON output:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_info-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"std:info"</span><span class="p">:</span><span class="w"> </span><span class="s2">"[1.0.0,2.5.0]"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Which would minimally indicate that the tool only supports the introspection
capability at versions "1.0.0" through "2.5.0".</p>
</div>
</div>
<div class="sect3">
<h4 id="_bounded"><a class="anchor" href="#_bounded"></a>4.1.2. Bounded</h4>
<div class="paragraph">
<p>A bounded <em>introspection</em> makes it possible to specify particular capabilities
that a consumer is looking for in a target tool. By giving a query to the target
tool the consumer cat get an answer for just the capabilities they care about.
This is particularly useful in cases where the consumer only supports some
versions of a capability and prefers to not implement the version comparison
logic to determine this from the unbounded <em>introspection</em>.</p>
</div>
<div class="paragraph">
<p>The bounded <em>introspection</em> works equivalently to the unbounded case except the
<code>--std-info</code> option takes a <em>version specification</em> value to say what
capabilities to filter the results by. For example running:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="shell">tool <span class="s2">"--std-info=std:info==[1.0.0,2.1.0)"</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Could produce this as a JSON output:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_info-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"std:info"</span><span class="p">:</span><span class="w"> </span><span class="s2">"[1.5.0,2.0.0]"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Here the tool is saying that it only supports a subset of what the consumer
asked about. It should also be possible to query about multiple capabilities of
the target tool by using multiple <code>--std-info</code> options.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="shell">tool <span class="s2">"--std-info=std:info=[1.0.0,2.1.0)"</span> <span class="s2">"--std-info=gcc:extra[2.0.0,2.1.0]"</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>In this example the target tool would return multiple capabilities, if
supported:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_info-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"std:info"</span><span class="p">:</span><span class="w"> </span><span class="s2">"[1.0.0,2.0.0)"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"gcc:extra"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2.1.0"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_declaration"><a class="anchor" href="#_declaration"></a>4.2. Declaration</h3>
<div class="paragraph">
<p>The consumer can inform, i.e. declare, the target tool that specific
capabilities should use particular versions when responding with information
using one or more <code>--std-decl=&lt;VersionSpec&gt;</code> options. The declarations can only
exist in tandem with options for the mentioned capabilities. It&#8217;s expected that
a consumer will first <em>introspect</em> a target tool to discover what it supports.
Followed by the consumer <em>declaring</em> to the target tool what version(s) of the
capabilities it is willing to consume. The target tool can then respond with
the versions of the capabilities that satisfies the consumer and its own
preference.</p>
</div>
<div class="paragraph">
<p>An exchange between a consumer and target tool would begin with the
<em>introspection</em>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="shell">tool <span class="s2">"--std-info=std:info=[1.0.0,2.1.0)"</span> <span class="s2">"--std-info=gcc:extra[2.0.0,2.1.0]"</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>With a target tool response:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_info-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"std:info"</span><span class="p">:</span><span class="w"> </span><span class="s2">"[1.0.0,2.0.0)"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"gcc:extra"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2.1.0"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Which the consumer can use to <em>declare</em> the specific capability versions:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="shell">tool <span class="s2">"--std-decl=std:info=2.0.0"</span> <span class="s2">"--std-decl=gcc:extra=2.1.0"</span> ...</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_capabilities"><a class="anchor" href="#_capabilities"></a>4.3. Capabilities</h3>
<div class="paragraph">
<p>For this proposal capabilities refers to any published coherent target tool
interface. This can include any single interface, like a single target tool
option. Or it can include a collective interface of the target tool that covers
many options. A capability is specified as a series of "scoped" identifiers
separated by colons (":"). The capability must match this regular expression:
<sup class="footnote" id="_footnote_Regex">[<a id="_footnoteref_2" class="footnote" href="#_footnotedef_2" title="View footnote.">2</a>]</sup></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="plan_text">^[a-z_]+(:[a-z_]+)+$</code></pre>
</div>
</div>
<div class="paragraph">
<p>At minimum a capability has two components. The first component is a general
scope that identifies if the capability is one in the IS, or if it&#8217;s a tool
vendor capability.</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Standard</dt>
<dd>
<p>A capability with a scope of <code>std</code> indicates that it&#8217;s defined in the
IS. <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup></p>
</dd>
<dt class="hdlist1">Vendor</dt>
<dd>
<p>Any other capability, i.e. other than <code>std</code>, is available for vendors
to use as extensions outside the IS. <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup></p>
</dd>
</dl>
</div>
</div>
<div class="sect2">
<h3 id="_version_specification"><a class="anchor" href="#_version_specification"></a>4.4. Version Specification</h3>
<div class="paragraph">
<p>When indicating the version, or versions, to the target tool or the consumer the
version information is specified in two possible forms: a single version, or a
single version range.</p>
</div>
<div class="sect3">
<h4 id="_single_version"><a class="anchor" href="#_single_version"></a>4.4.1. Single Version</h4>
<div class="paragraph">
<p>A single version in this proposal is composed of a dotted triplet of whole
numbers. The numbers are expected to be strictly increasing. But otherwise do
not impart any meaning to the components. Specifically this does not impart any
for of semantic meaning between versions. Although the specification of the
capabilities themselves may define such a semantic meaning. The format for the
version must match the regular expression:
<sup class="footnoteref">[<a class="footnote" href="#_footnotedef_2" title="View footnote.">2</a>]</sup></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="plain_text">^[0-9]+[.][0-9]+[.][0-9]+$</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_version_range"><a class="anchor" href="#_version_range"></a>4.4.2. Version Range</h4>
<div class="paragraph">
<p>A version range in this proposal indicates a lower and upper bound of versions.
It is composed of a pair of versions, separated by a comma, and bracketed by
either an inclusive or exclusive symbol. This matches the intuition of a
mathematic interval, but with the use of the version triplet number line.
<sup class="footnote">[<a id="_footnoteref_3" class="footnote" href="#_footnotedef_3" title="View footnote.">3</a>]</sup>
Like the interval notation the <code>()</code> brackets indicate an exclusive point. And
the <code>[]</code> brackets indicate an inclusive point. As versions are decidedly not
single integers we use a <code>,</code> (comma) to separate the start and end of the range
instead of using <code>..</code>. Hence the format for the version range must match the
regular expression:
<sup class="footnoteref">[<a class="footnote" href="#_footnotedef_2" title="View footnote.">2</a>]</sup></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="plain_text">^([0-9]+[.][0-9]+[.][0-9]+)|([[(][0-9]+[.][0-9]+[.][0-9]+,[0-9]+[.][0-9]+[.][0-9]+[)\\]])$</code></pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_version_matching"><a class="anchor" href="#_version_matching"></a>4.5. Version Matching</h3>
<div class="paragraph">
<p>When given two version specifications tools will need to match the two to
determine the sub-range that are compatible with both. There are two aspects to
doing that matching: comparing the two single versions, and evaluating the
sub-range interval.</p>
</div>
<div class="sect3">
<h4 id="_single_version_comparison"><a class="anchor" href="#_single_version_comparison"></a>4.5.1. Single Version Comparison</h4>
<div class="paragraph">
<p>Comparing two single versions equates to three-way comparing each of the
components of both, <code>a</code> and <code>b</code>, as:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>If the whole numbers of the first components, <code>i</code> and <code>j</code>, are not equal the
comparison is either <code>a &lt; b</code> or <code>a &gt; b</code> if <code>i &lt; j</code> or <code>i &gt; j</code> respectively.
Otherwise,</p>
</li>
<li>
<p>If the whole numbers of the second components, <code>k</code> and <code>l</code>, are not equal the
comparison is either <code>a &lt; b</code> or <code>a &gt; b</code> if <code>k &lt; l</code> or <code>k &gt; l</code> respectively.
Otherwise,</p>
</li>
<li>
<p>If the whole numbers of the third components, <code>m</code> and <code>n</code>, are not equal the
comparison is either <code>a &lt; b</code> or <code>a &gt; b</code> if <code>m &lt; n</code> or <code>m &gt; n</code> respectively.
Otherwise,</p>
</li>
<li>
<p>The versions are equal, i.e. <code>a == b</code>.</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_range_comparison"><a class="anchor" href="#_range_comparison"></a>4.5.2. Range Comparison</h4>
<div class="paragraph">
<p>Tools will need to compare either a single version to a version range, or a
version range to another range to determine the overlapping version sub-range.
The single version to a version range comparison can be reformulated to a
range-to-range comparison. I.e. a comparison of a single range <code>a</code> to a range
<code>b</code> is equivalent to a comparison of range <code>[a,a]</code> to range <code>b</code>. Hence we only
need to consider the range-to-range comparison. Although implementations may
use special case for comparing single-to-range and range-to-single.
Range-to-range should follow something like the following to compare a range
<code>a,b</code> to <code>m,n</code>, with some varied inclusive or exclusive ends:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>If <code>b &lt; m</code> or <code>n &lt; a</code> the range is <em>empty</em>.</p>
</li>
<li>
<p>Otherwise, assign a <em>partial</em> range <code>x,y = max(a,m), min(b,n)</code>.</p>
</li>
<li>
<p>If <code>a</code> or <code>m</code> are inclusive, then:</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>If <code>b</code> or <code>n</code> are inclusive, then the range is <code>[x,y]</code>.</p>
</li>
<li>
<p>Otherwise, the range is <code>[x,y)</code>.</p>
</li>
</ol>
</div>
</li>
<li>
<p>Otherwise, if <code>b</code> or <code>n</code> are inclusive, then the range is <code>(x,y]</code>.</p>
</li>
<li>
<p>Otherwise, the range is <code>(x,y)</code>.</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_format"><a class="anchor" href="#_format"></a>4.6. Format</h3>
<div class="paragraph">
<p>The information reported by <em>introspection</em> is a JSON
<sup class="footnote" id="_footnote_json">[<a id="_footnoteref_4" class="footnote" href="#_footnotedef_4" title="View footnote.">4</a>]</sup>
format document. Some advantages to using JSON:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>It is widely used and available either natively or through libraries in many
programming languages. Which is particularly important as C&#43;&#43; tools are
written in an array of differing programming languages.</p>
</li>
<li>
<p>It is a simple format to understand by both programs and humans.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>In maintaining our goals of the interface being minimal, concise, and robust,
the format for communicating the capabilities is a single key/value collection,
i.e. a JSON object.
<sup class="footnoteref">[<a class="footnote" href="#_footnotedef_4" title="View footnote.">4</a>]</sup></p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Capability Identifier</dt>
<dd>
<p>The <em>key</em> is a string with the capability identifier. The
format of the is as described in the <a href="#_capabilities">Capabilities</a> section.</p>
</dd>
<dt class="hdlist1">Version Specification</dt>
<dd>
<p>The <em>value</em> indicates the versions supported by the tool
for the capability. The versions follows the format described in the
<a href="#_version_specification">Version Specification</a> section.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>In addition to the <em>capability identifier</em> / <em>version specification</em> members,
there are additional special members:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Schema</dt>
<dd>
<p>The document can also specify a reference to a JSON Schema.
<sup class="footnote" id="_footnote_jschema">[<a id="_footnoteref_5" class="footnote" href="#_footnotedef_5" title="View footnote.">5</a>]</sup>
For this the <em>key</em> would be <code>$schema</code>, and the <em>value</em> would a URI to a
published stable schema
(<code><a href="https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_info-1.0.0.json" class="bare">https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_info-1.0.0.json</a></code>).</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>There is one designated capability that is required to appear in the document:
The <code>std:info</code> capability with a corresponding <em>version specification</em>. This
requirement allows a consumer to identify the format of the rest of the document
at all times.</p>
</div>
<div class="paragraph">
<p>This is a minimal conforming document:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_info-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"std:info"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.0.0"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>This is also a minimal conforming document. But specifies a range of versions
supported for the <code>std:info</code> capability:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_info-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"std:info"</span><span class="p">:</span><span class="w"> </span><span class="s2">"[1.0.0,2.0.0)"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>This example adds a custom vendor capability:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_info-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"std:info"</span><span class="p">:</span><span class="w"> </span><span class="s2">"[1.0.0,2.0.0)"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"gcc:extra"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.5.0"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>See the <a href="#_wording">Wording</a> for a JSON <a href="#_schema">Schema</a> for this format.</p>
</div>
</div>
<div class="sect2">
<h3 id="_impact_on_the_standard"><a class="anchor" href="#_impact_on_the_standard"></a>4.7. Impact On The Standard</h3>

</div>
</div>
</div>
<div class="sect1">
<h2 id="_implementation_experience"><a class="anchor" href="#_implementation_experience"></a>5. Implementation Experience</h2>
<div class="sectionbody">
<div class="paragraph">
<p>None yet.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_polls"><a class="anchor" href="#_polls"></a>6. Polls</h2>
<div class="sectionbody">
<div class="paragraph">
<p>None yet.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wording"><a class="anchor" href="#_wording"></a>7. Wording</h2>
<div class="sectionbody">
<div class="paragraph">
<p>None yet.</p>
</div>
<div class="sect2">
<h3 id="_schema"><a class="anchor" href="#_schema"></a>7.1. Schema</h3>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
	</span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://json-schema.org/draft/2020-12/schema"</span><span class="p">,</span><span class="w">
	</span><span class="nl">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_info-1.0.0.json"</span><span class="p">,</span><span class="w">
	</span><span class="nl">"title"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Tool Introspection Version 1.0.0 JSON Schema"</span><span class="p">,</span><span class="w">
	</span><span class="nl">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
		</span><span class="s2">"$schema"</span><span class="p">,</span><span class="w">
		</span><span class="s2">"std:info"</span><span class="w">
	</span><span class="p">],</span><span class="w">
	</span><span class="nl">"$defs"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
		</span><span class="nl">"VersionSpec"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
			</span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="p">,</span><span class="w">
			</span><span class="nl">"pattern"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^([0-9]+[.][0-9]+[.][0-9]+)|([[(][0-9]+[.][0-9]+[.][0-9]+,[0-9]+[.][0-9]+[.][0-9]+[)</span><span class="se">\\</span><span class="s2">]])$"</span><span class="w">
		</span><span class="p">}</span><span class="w">
	</span><span class="p">},</span><span class="w">
	</span><span class="nl">"anyOf"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
		</span><span class="p">{</span><span class="w">
			</span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="p">,</span><span class="w">
			</span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
				</span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
					</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"The URI of the JSON schema corresponding to the version of the tool introspection format."</span><span class="p">,</span><span class="w">
					</span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="p">,</span><span class="w">
					</span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"uri"</span><span class="w">
				</span><span class="p">},</span><span class="w">
				</span><span class="nl">"std:info"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
					</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"The Tool Introspection format version."</span><span class="p">,</span><span class="w">
					</span><span class="nl">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#/$defs/VersionSpec"</span><span class="w">
				</span><span class="p">}</span><span class="w">
			</span><span class="p">}</span><span class="w">
		</span><span class="p">},</span><span class="w">
		</span><span class="p">{</span><span class="w">
			</span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="p">,</span><span class="w">
			</span><span class="nl">"propertyNames"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
				</span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="p">,</span><span class="w">
				</span><span class="nl">"pattern"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^[a-z_]+(:[a-z_]+)+$"</span><span class="w">
			</span><span class="p">},</span><span class="w">
			</span><span class="nl">"patternProperties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
				</span><span class="nl">""</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
					</span><span class="nl">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#/$defs/VersionSpec"</span><span class="w">
				</span><span class="p">}</span><span class="w">
			</span><span class="p">}</span><span class="w">
		</span><span class="p">}</span><span class="w">
	</span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_acknowledgements"><a class="anchor" href="#_acknowledgements"></a>8. Acknowledgements</h2>
<div class="sectionbody">
<div class="paragraph">
<p>None yet.</p>
</div>
</div>
</div>
</div>
<div id="footnotes">
<hr>
<div class="footnote" id="_footnotedef_1">
<a href="#_footnoteref_1">1</a>. <a href="https://wg21.link/P2656" class="bare">https://wg21.link/P2656</a> C&#43;&#43; Ecosystem International Standard
</div>
<div class="footnote" id="_footnotedef_2">
<a href="#_footnoteref_2">2</a>. ECMAScript® 2022 language specification, 13th edition, June 2022 (<a href="https://www.ecma-international.org/publications-and-standards/standards/ecma-262/" class="bare">https://www.ecma-international.org/publications-and-standards/standards/ecma-262/</a>)
</div>
<div class="footnote" id="_footnotedef_3">
<a href="#_footnoteref_3">3</a>. Wikipedia: Interval (mathematics) (<a href="https://en.wikipedia.org/wiki/Interval_(mathematics)" class="bare">https://en.wikipedia.org/wiki/Interval_(mathematics)</a>)
</div>
<div class="footnote" id="_footnotedef_4">
<a href="#_footnoteref_4">4</a>. ISO/IEC 21778:2017 Information technology — The JSON data interchange syntax, (<a href="https://www.iso.org/standard/71616.html" class="bare">https://www.iso.org/standard/71616.html</a>)
</div>
<div class="footnote" id="_footnotedef_5">
<a href="#_footnoteref_5">5</a>. JSON Schema: A Media Type for Describing JSON Documents (<a href="http://json-schema.org/latest/json-schema-core.html" class="bare">http://json-schema.org/latest/json-schema-core.html</a>)
</div>
</div>
</body>
</html>