diff --git a/assets/custom.css b/assets/custom.css new file mode 100644 index 0000000000..bb3bbda28f --- /dev/null +++ b/assets/custom.css @@ -0,0 +1,17 @@ +.snippet-button { + float: right; + vertical-align: middle; + padding: 0.25em 0.25em; + border: 1px solid #ddd; + margin: 0.25em; + border-radius: 5px; + cursor: pointer; +} + +.copy-snippet { + visibility: hidden; +} + +.snippet-button:hover { + background: #c5cae9; +} diff --git a/assets/fonts/font-awesome.css b/assets/fonts/font-awesome.css new file mode 100644 index 0000000000..b476b53e33 --- /dev/null +++ b/assets/fonts/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url("specimen/FontAwesome.woff2") format("woff2"),url("specimen/FontAwesome.woff") format("woff"),url("specimen/FontAwesome.ttf") format("truetype")}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} \ No newline at end of file diff --git a/assets/fonts/material-icons.css b/assets/fonts/material-icons.css new file mode 100644 index 0000000000..d23d365ed6 --- /dev/null +++ b/assets/fonts/material-icons.css @@ -0,0 +1,13 @@ +/*! + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE + * DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + * SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND + * LIMITATIONS UNDER THE LICENSE. + */@font-face{font-family:"Material Icons";font-style:normal;font-weight:400;src:local("Material Icons"),local("MaterialIcons-Regular"),url("specimen/MaterialIcons-Regular.woff2") format("woff2"),url("specimen/MaterialIcons-Regular.woff") format("woff"),url("specimen/MaterialIcons-Regular.ttf") format("truetype")} \ No newline at end of file diff --git a/assets/fonts/specimen/FontAwesome.ttf b/assets/fonts/specimen/FontAwesome.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/assets/fonts/specimen/FontAwesome.ttf differ diff --git a/assets/fonts/specimen/FontAwesome.woff b/assets/fonts/specimen/FontAwesome.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/assets/fonts/specimen/FontAwesome.woff differ diff --git a/assets/fonts/specimen/FontAwesome.woff2 b/assets/fonts/specimen/FontAwesome.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/assets/fonts/specimen/FontAwesome.woff2 differ diff --git a/assets/fonts/specimen/MaterialIcons-Regular.ttf b/assets/fonts/specimen/MaterialIcons-Regular.ttf new file mode 100644 index 0000000000..7015564ad1 Binary files /dev/null and b/assets/fonts/specimen/MaterialIcons-Regular.ttf differ diff --git a/assets/fonts/specimen/MaterialIcons-Regular.woff b/assets/fonts/specimen/MaterialIcons-Regular.woff new file mode 100644 index 0000000000..b648a3eea2 Binary files /dev/null and b/assets/fonts/specimen/MaterialIcons-Regular.woff differ diff --git a/assets/fonts/specimen/MaterialIcons-Regular.woff2 b/assets/fonts/specimen/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000..9fa2112520 Binary files /dev/null and b/assets/fonts/specimen/MaterialIcons-Regular.woff2 differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000..23ccc2bac7 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/application.583bbe55.js b/assets/javascripts/application.583bbe55.js new file mode 100644 index 0000000000..f577b6952f --- /dev/null +++ b/assets/javascripts/application.583bbe55.js @@ -0,0 +1,6 @@ +/*! + Material for MkDocs + Copyright (c) 2016-2019 Martin Donath + License: MIT +*/ +!function(e,t){for(var n in t)e[n]=t[n]}(window,function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t,n){"use strict";t.__esModule=!0,t.default={createElement:function(e,t){var n=document.createElement(e);t&&Array.prototype.forEach.call(Object.keys(t),function(e){n.setAttribute(e,t[e])});for(var r=arguments.length,i=Array(r>2?r-2:0),o=2;o pre, pre > code");Array.prototype.forEach.call(n,function(t,n){var r="__code_"+n,i=e.createElement("button",{class:"md-clipboard",title:h("clipboard.copy"),"data-clipboard-target":"#"+r+" pre, #"+r+" code"},e.createElement("span",{class:"md-clipboard__message"})),o=t.parentNode;o.id=r,o.insertBefore(i,t)});new c.default(".md-clipboard").on("success",function(e){var t=e.trigger.querySelector(".md-clipboard__message");if(!(t instanceof HTMLElement))throw new ReferenceError;e.clearSelection(),t.dataset.mdTimer&&clearTimeout(parseInt(t.dataset.mdTimer,10)),t.classList.add("md-clipboard__message--active"),t.innerHTML=h("clipboard.copied"),t.dataset.mdTimer=setTimeout(function(){t.classList.remove("md-clipboard__message--active"),t.dataset.mdTimer=""},2e3).toString()})}if(!Modernizr.details){var r=document.querySelectorAll("details > summary");Array.prototype.forEach.call(r,function(e){e.addEventListener("click",function(e){var t=e.target.parentNode;t.hasAttribute("open")?t.removeAttribute("open"):t.setAttribute("open","")})})}var i=function(){if(document.location.hash){var e=document.getElementById(document.location.hash.substring(1));if(!e)return;for(var t=e.parentNode;t&&!(t instanceof HTMLDetailsElement);)t=t.parentNode;if(t&&!t.open){t.open=!0;var n=location.hash;location.hash=" ",location.hash=n}}};if(window.addEventListener("hashchange",i),i(),Modernizr.ios){var o=document.querySelectorAll("[data-md-scrollfix]");Array.prototype.forEach.call(o,function(e){e.addEventListener("touchstart",function(){var t=e.scrollTop;0===t?e.scrollTop=1:t+e.offsetHeight===e.scrollHeight&&(e.scrollTop=t-1)})})}}).listen(),new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Header.Shadow("[data-md-component=container]","[data-md-component=header]")).listen(),new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Header.Title("[data-md-component=title]",".md-typeset h1")).listen(),document.querySelector("[data-md-component=hero]")&&new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Tabs.Toggle("[data-md-component=hero]")).listen(),document.querySelector("[data-md-component=tabs]")&&new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Tabs.Toggle("[data-md-component=tabs]")).listen(),new f.default.Event.MatchMedia("(min-width: 1220px)",new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Sidebar.Position("[data-md-component=navigation]","[data-md-component=header]"))),document.querySelector("[data-md-component=toc]")&&new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Sidebar.Position("[data-md-component=toc]","[data-md-component=header]"))),new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener(window,"scroll",new f.default.Nav.Blur("[data-md-component=toc] [href]")));var n=document.querySelectorAll("[data-md-component=collapsible]");Array.prototype.forEach.call(n,function(e){new f.default.Event.MatchMedia("(min-width: 1220px)",new f.default.Event.Listener(e.previousElementSibling,"click",new f.default.Nav.Collapse(e)))}),new f.default.Event.MatchMedia("(max-width: 1219px)",new f.default.Event.Listener("[data-md-component=navigation] [data-md-toggle]","change",new f.default.Nav.Scrolling("[data-md-component=navigation] nav"))),document.querySelector("[data-md-component=search]")&&(new f.default.Event.MatchMedia("(max-width: 959px)",new f.default.Event.Listener("[data-md-toggle=search]","change",new f.default.Search.Lock("[data-md-toggle=search]"))),new f.default.Event.Listener("[data-md-component=query]",["focus","keyup","change"],new f.default.Search.Result("[data-md-component=result]",function(){return fetch(t.url.base+"/"+(t.version<"0.17"?"mkdocs":"search")+"/search_index.json",{credentials:"same-origin"}).then(function(e){return e.json()}).then(function(e){return e.docs.map(function(e){return e.location=t.url.base+"/"+e.location,e})})})).listen(),new f.default.Event.Listener("[data-md-component=reset]","click",function(){setTimeout(function(){var e=document.querySelector("[data-md-component=query]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.focus()},10)}).listen(),new f.default.Event.Listener("[data-md-toggle=search]","change",function(e){setTimeout(function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.focus()}},400,e.target)}).listen(),new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener("[data-md-component=query]","focus",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked||(e.checked=!0,e.dispatchEvent(new CustomEvent("change")))})),new f.default.Event.Listener(window,"keydown",function(e){var t=document.querySelector("[data-md-toggle=search]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;var n=document.querySelector("[data-md-component=query]");if(!(n instanceof HTMLInputElement))throw new ReferenceError;if(!e.metaKey&&!e.ctrlKey)if(t.checked){if(13===e.keyCode){if(n===document.activeElement){e.preventDefault();var r=document.querySelector("[data-md-component=search] [href][data-md-state=active]");r instanceof HTMLLinkElement&&(window.location=r.getAttribute("href"),t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur())}}else if(9===e.keyCode||27===e.keyCode)t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur();else if(-1!==[8,37,39].indexOf(e.keyCode))n!==document.activeElement&&n.focus();else if(-1!==[38,40].indexOf(e.keyCode)){var i=e.keyCode,o=Array.prototype.slice.call(document.querySelectorAll("[data-md-component=query], [data-md-component=search] [href]")),a=o.find(function(e){if(!(e instanceof HTMLElement))throw new ReferenceError;return"active"===e.dataset.mdState});a&&(a.dataset.mdState="");var s=Math.max(0,(o.indexOf(a)+o.length+(38===i?-1:1))%o.length);return o[s]&&(o[s].dataset.mdState="active",o[s].focus()),e.preventDefault(),e.stopPropagation(),!1}}else document.activeElement&&!document.activeElement.form&&(70!==e.keyCode&&83!==e.keyCode||(n.focus(),e.preventDefault()))}).listen(),new f.default.Event.Listener(window,"keypress",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t!==document.activeElement&&t.focus()}}).listen()),new f.default.Event.Listener(document.body,"keydown",function(e){if(9===e.keyCode){var t=document.querySelectorAll("[data-md-component=navigation] .md-nav__link[for]:not([tabindex])");Array.prototype.forEach.call(t,function(e){e.offsetHeight&&(e.tabIndex=0)})}}).listen(),new f.default.Event.Listener(document.body,"mousedown",function(){var e=document.querySelectorAll("[data-md-component=navigation] .md-nav__link[tabindex]");Array.prototype.forEach.call(e,function(e){e.removeAttribute("tabIndex")})}).listen(),document.body.addEventListener("click",function(){"tabbing"===document.body.dataset.mdState&&(document.body.dataset.mdState="")}),new f.default.Event.MatchMedia("(max-width: 959px)",new f.default.Event.Listener("[data-md-component=navigation] [href^='#']","click",function(){var e=document.querySelector("[data-md-toggle=drawer]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked&&(e.checked=!1,e.dispatchEvent(new CustomEvent("change")))})),function(){var e=document.querySelector("[data-md-source]");if(!e)return a.default.resolve([]);if(!(e instanceof HTMLAnchorElement))throw new ReferenceError;switch(e.dataset.mdSource){case"github":return new f.default.Source.Adapter.GitHub(e).fetch();default:return a.default.resolve([])}}().then(function(e){var t=document.querySelectorAll("[data-md-source]");Array.prototype.forEach.call(t,function(t){new f.default.Source.Repository(t).initialize(e)})})}t.__esModule=!0,t.app=void 0,n(7),n(8),n(9),n(10),n(11),n(12),n(13);var o=n(14),a=r(o),s=n(19),c=r(s),u=n(20),l=r(u),d=n(21),f=r(d);window.Promise=window.Promise||a.default;var h=function(e){var t=document.getElementsByName("lang:"+e)[0];if(!(t instanceof HTMLMetaElement))throw new ReferenceError;return t.content},p={initialize:i};t.app=p}).call(t,n(0))},function(e,t,n){e.exports=n.p+"assets/images/icons/bitbucket.1b09e088.svg"},function(e,t,n){e.exports=n.p+"assets/images/icons/github.f0b8504a.svg"},function(e,t,n){e.exports=n.p+"assets/images/icons/gitlab.6dd19c00.svg"},function(e,t){},function(e,t){},function(e,t){!function(){if("undefined"!=typeof window)try{var e=new window.CustomEvent("test",{cancelable:!0});if(e.preventDefault(),!0!==e.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var t=function(e,t){var n,r;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},n=document.createEvent("CustomEvent"),n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r=n.preventDefault,n.preventDefault=function(){r.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};t.prototype=window.Event.prototype,window.CustomEvent=t}}()},function(e,t,n){window.fetch||(window.fetch=n(2).default||n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){function r(){}function i(e,t){return function(){e.apply(t,arguments)}}function o(e){if(!(this instanceof o))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],d(e,this)}function a(e,t){for(;3===e._state;)e=e._value;if(0===e._state)return void e._deferreds.push(t);e._handled=!0,o._immediateFn(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null===n)return void(1===e._state?s:c)(t.promise,e._value);var r;try{r=n(e._value)}catch(e){return void c(t.promise,e)}s(t.promise,r)})}function s(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if(t instanceof o)return e._state=3,e._value=t,void u(e);if("function"==typeof n)return void d(i(n,t),e)}e._state=1,e._value=t,u(e)}catch(t){c(e,t)}}function c(e,t){e._state=2,e._value=t,u(e)}function u(e){2===e._state&&0===e._deferreds.length&&o._immediateFn(function(){e._handled||o._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;t=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(16),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(t,n(1))},function(e,t,n){(function(e,t){!function(e,n){"use strict";function r(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,r.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,r.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":i(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}();e.exports=a})},function(e,t,n){function r(e,t,n){if(!e&&!t&&!n)throw new Error("Missing required arguments");if(!s.string(t))throw new TypeError("Second argument must be a String");if(!s.fn(n))throw new TypeError("Third argument must be a Function");if(s.node(e))return i(e,t,n);if(s.nodeList(e))return o(e,t,n);if(s.string(e))return a(e,t,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function i(e,t,n){return e.addEventListener(t,n),{destroy:function(){e.removeEventListener(t,n)}}}function o(e,t,n){return Array.prototype.forEach.call(e,function(e){e.addEventListener(t,n)}),{destroy:function(){Array.prototype.forEach.call(e,function(e){e.removeEventListener(t,n)})}}}function a(e,t,n){return c(document.body,e,t,n)}var s=n(6),c=n(5);e.exports=r},function(e,t){function n(){}n.prototype={on:function(e,t,n){var r=this.e||(this.e={});return(r[e]||(r[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){function r(){i.off(e,r),t.apply(n,arguments)}var i=this;return r._=t,this.on(e,r,n)},emit:function(e){var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),r=0,i=n.length;for(r;r0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===f(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=(0,d.default)(e,"click",function(e){return t.onClick(e)})}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new u.default({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return c("action",e)}},{key:"defaultTarget",value:function(e){var t=c("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return c("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach(function(e){n=n&&!!document.queryCommandSupported(e)}),n}}]),t}(l.default);e.exports=p})},function(e,t){function n(e,t){for(;e&&e.nodeType!==r;){if("function"==typeof e.matches&&e.matches(t))return e;e=e.parentNode}}var r=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}e.exports=n},function(e,t,n){function r(e,t,n,r,i){var a=o.apply(this,arguments);return e.addEventListener(n,a,i),{destroy:function(){e.removeEventListener(n,a,i)}}}function i(e,t,n,i,o){return"function"==typeof e.addEventListener?r.apply(null,arguments):"function"==typeof n?r.bind(null,document).apply(null,arguments):("string"==typeof e&&(e=document.querySelectorAll(e)),Array.prototype.map.call(e,function(e){return r(e,t,n,i,o)}))}function o(e,t,n,r){return function(n){n.delegateTarget=a(n.target,t),n.delegateTarget&&r.call(e,n)}}var a=n(4);e.exports=i},function(e,t){t.node=function(e){return void 0!==e&&e instanceof HTMLElement&&1===e.nodeType},t.nodeList=function(e){var n=Object.prototype.toString.call(e);return void 0!==e&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in e&&(0===e.length||t.node(e[0]))},t.string=function(e){return"string"==typeof e||e instanceof String},t.fn=function(e){return"[object Function]"===Object.prototype.toString.call(e)}},function(e,t){function n(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var r=window.getSelection(),i=document.createRange();i.selectNodeContents(e),r.removeAllRanges(),r.addRange(i),t=r.toString()}return t}e.exports=n}])})},function(e,t,n){var r;!function(){"use strict";function i(e,t){var n;if(t=t||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=t.touchBoundary||10,this.layer=e,this.tapDelay=t.tapDelay||200,this.tapTimeout=t.tapTimeout||700,!i.notNeeded(e)){for(var r=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],o=this,s=0,c=r.length;s=0,a=navigator.userAgent.indexOf("Android")>0&&!o,s=/iP(ad|hone|od)/.test(navigator.userAgent)&&!o,c=s&&/OS 4_\d(_\d)?/.test(navigator.userAgent),u=s&&/OS [6-7]_\d/.test(navigator.userAgent),l=navigator.userAgent.indexOf("BB10")>0;i.prototype.needsClick=function(e){switch(e.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(e.disabled)return!0;break;case"input":if(s&&"file"===e.type||e.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(e.className)},i.prototype.needsFocus=function(e){switch(e.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!a;case"input":switch(e.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!e.disabled&&!e.readOnly;default:return/\bneedsfocus\b/.test(e.className)}},i.prototype.sendClick=function(e,t){var n,r;document.activeElement&&document.activeElement!==e&&document.activeElement.blur(),r=t.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(e),!0,!0,window,1,r.screenX,r.screenY,r.clientX,r.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,e.dispatchEvent(n)},i.prototype.determineEventType=function(e){return a&&"select"===e.tagName.toLowerCase()?"mousedown":"click"},i.prototype.focus=function(e){var t;s&&e.setSelectionRange&&0!==e.type.indexOf("date")&&"time"!==e.type&&"month"!==e.type?(t=e.value.length,e.setSelectionRange(t,t)):e.focus()},i.prototype.updateScrollParent=function(e){var t,n;if(!(t=e.fastClickScrollParent)||!t.contains(e)){n=e;do{if(n.scrollHeight>n.offsetHeight){t=n,e.fastClickScrollParent=n;break}n=n.parentElement}while(n)}t&&(t.fastClickLastScrollTop=t.scrollTop)},i.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},i.prototype.onTouchStart=function(e){var t,n,r;if(e.targetTouches.length>1)return!0;if(t=this.getTargetElementFromEventTarget(e.target),n=e.targetTouches[0],s){if(r=window.getSelection(),r.rangeCount&&!r.isCollapsed)return!0;if(!c){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return e.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(t)}}return this.trackingClick=!0,this.trackingClickStart=e.timeStamp,this.targetElement=t,this.touchStartX=n.pageX,this.touchStartY=n.pageY,e.timeStamp-this.lastClickTimen||Math.abs(t.pageY-this.touchStartY)>n},i.prototype.onTouchMove=function(e){return!this.trackingClick||((this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0)},i.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},i.prototype.onTouchEnd=function(e){var t,n,r,i,o,l=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,n=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,u&&(o=e.changedTouches[0],l=document.elementFromPoint(o.pageX-window.pageXOffset,o.pageY-window.pageYOffset)||l,l.fastClickScrollParent=this.targetElement.fastClickScrollParent),"label"===(r=l.tagName.toLowerCase())){if(t=this.findControl(l)){if(this.focus(l),a)return!1;l=t}}else if(this.needsFocus(l))return e.timeStamp-n>100||s&&window.top!==window&&"input"===r?(this.targetElement=null,!1):(this.focus(l),this.sendClick(l,e),s&&"select"===r||(this.targetElement=null,e.preventDefault()),!1);return!(!s||c||!(i=l.fastClickScrollParent)||i.fastClickLastScrollTop===i.scrollTop)||(this.needsClick(l)||(e.preventDefault(),this.sendClick(l,e)),!1)},i.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},i.prototype.onMouse=function(e){return!this.targetElement||(!!e.forwardedTouchEvent||(!e.cancelable||(!(!this.needsClick(this.targetElement)||this.cancelNextClick)||(e.stopImmediatePropagation?e.stopImmediatePropagation():e.propagationStopped=!0,e.stopPropagation(),e.preventDefault(),!1))))},i.prototype.onClick=function(e){var t;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===e.target.type&&0===e.detail||(t=this.onMouse(e),t||(this.targetElement=null),t)},i.prototype.destroy=function(){var e=this.layer;a&&(e.removeEventListener("mouseover",this.onMouse,!0),e.removeEventListener("mousedown",this.onMouse,!0),e.removeEventListener("mouseup",this.onMouse,!0)),e.removeEventListener("click",this.onClick,!0),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1),e.removeEventListener("touchcancel",this.onTouchCancel,!1)},i.notNeeded=function(e){var t,n,r;if(void 0===window.ontouchstart)return!0;if(n=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!a)return!0;if(t=document.querySelector("meta[name=viewport]")){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(n>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(l&&(r=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),r[1]>=10&&r[2]>=3&&(t=document.querySelector("meta[name=viewport]")))){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===e.style.msTouchAction||"manipulation"===e.style.touchAction||(!!(+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]>=27&&(t=document.querySelector("meta[name=viewport]"))&&(-1!==t.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))||("none"===e.style.touchAction||"manipulation"===e.style.touchAction))},i.attach=function(e,t){return new i(e,t)},void 0!==(r=function(){return i}.call(t,n,t,e))&&(e.exports=r)}()},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(22),o=r(i),a=n(24),s=r(a),c=n(27),u=r(c),l=n(31),d=r(l),f=n(37),h=r(f),p=n(39),m=r(p),v=n(45),y=r(v);t.default={Event:o.default,Header:s.default,Nav:u.default,Search:d.default,Sidebar:h.default,Source:m.default,Tabs:y.default}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(3),o=r(i),a=n(23),s=r(a);t.default={Listener:o.default,MatchMedia:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(3),o=(function(e){e&&e.__esModule}(i),function e(t,n){r(this,e),this.handler_=function(e){e.matches?n.listen():n.unlisten()};var i=window.matchMedia(t);i.addListener(this.handler_),this.handler_(i)});t.default=o},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(25),o=r(i),a=n(26),s=r(a);t.default={Shadow:o.default,Title:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement&&i.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=i.parentNode,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLElement))throw new ReferenceError;this.header_=i,this.height_=0,this.active_=!1}return e.prototype.setup=function(){for(var e=this.el_;e=e.previousElementSibling;){if(!(e instanceof HTMLElement))throw new ReferenceError;this.height_+=e.offsetHeight}this.update()},e.prototype.update=function(e){if(!e||"resize"!==e.type&&"orientationchange"!==e.type){var t=window.pageYOffset>=this.height_;t!==this.active_&&(this.header_.dataset.mdState=(this.active_=t)?"shadow":"")}else this.height_=0,this.setup()},e.prototype.reset=function(){this.header_.dataset.mdState="",this.height_=0,this.active_=!1},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement))throw new ReferenceError;if(this.el_=i,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLHeadingElement))throw new ReferenceError;this.header_=i,this.active_=!1}return e.prototype.setup=function(){var e=this;Array.prototype.forEach.call(this.el_.children,function(t){t.style.width=e.el_.offsetWidth-20+"px"})},e.prototype.update=function(e){var t=this,n=window.pageYOffset>=this.header_.offsetTop;n!==this.active_&&(this.el_.dataset.mdState=(this.active_=n)?"active":""),"resize"!==e.type&&"orientationchange"!==e.type||Array.prototype.forEach.call(this.el_.children,function(e){e.style.width=t.el_.offsetWidth-20+"px"})},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.width="",this.active_=!1},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(28),o=r(i),a=n(29),s=r(a),c=n(30),u=r(c);t.default={Blur:o.default,Collapse:s.default,Scrolling:u.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e),this.els_="string"==typeof t?document.querySelectorAll(t):t,this.index_=0,this.offset_=window.pageYOffset,this.dir_=!1,this.anchors_=[].reduce.call(this.els_,function(e,t){return e.concat(document.getElementById(t.hash.substring(1))||[])},[])}return e.prototype.setup=function(){this.update()},e.prototype.update=function(){var e=window.pageYOffset,t=this.offset_-e<0;if(this.dir_!==t&&(this.index_=this.index_=t?0:this.els_.length-1),0!==this.anchors_.length){if(this.offset_<=e)for(var n=this.index_+1;n0&&(this.els_[n-1].dataset.mdState="blur"),this.index_=n;else for(var r=this.index_;r>=0;r--){if(!(this.anchors_[r].offsetTop-80>e)){this.index_=r;break}r>0&&(this.els_[r-1].dataset.mdState="")}this.offset_=e,this.dir_=t}},e.prototype.reset=function(){Array.prototype.forEach.call(this.els_,function(e){e.dataset.mdState=""}),this.index_=0,this.offset_=window.pageYOffset},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLElement))throw new ReferenceError;this.el_=n}return e.prototype.setup=function(){var e=this.el_.getBoundingClientRect().height;this.el_.style.display=e?"block":"none",this.el_.style.overflow=e?"visible":"hidden"},e.prototype.update=function(){var e=this,t=this.el_.getBoundingClientRect().height;if(this.el_.style.display="block",this.el_.style.overflow="",t)this.el_.style.maxHeight=t+"px",requestAnimationFrame(function(){e.el_.setAttribute("data-md-state","animate"),e.el_.style.maxHeight="0px"});else{this.el_.setAttribute("data-md-state","expand"),this.el_.style.maxHeight="";var n=this.el_.getBoundingClientRect().height;this.el_.removeAttribute("data-md-state"),this.el_.style.maxHeight="0px",requestAnimationFrame(function(){e.el_.setAttribute("data-md-state","animate"),e.el_.style.maxHeight=n+"px"})}var r=function e(n){var r=n.target;if(!(r instanceof HTMLElement))throw new ReferenceError;r.removeAttribute("data-md-state"),r.style.maxHeight="",r.style.display=t?"none":"block",r.style.overflow=t?"hidden":"visible",r.removeEventListener("transitionend",e)};this.el_.addEventListener("transitionend",r,!1)},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.maxHeight="",this.el_.style.display="",this.el_.style.overflow=""},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLElement))throw new ReferenceError;this.el_=n}return e.prototype.setup=function(){this.el_.children[this.el_.children.length-1].style.webkitOverflowScrolling="touch";var e=this.el_.querySelectorAll("[data-md-toggle]");Array.prototype.forEach.call(e,function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=e.nextElementSibling;if(!(t instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==t.tagName&&t.nextElementSibling;)t=t.nextElementSibling;if(!(e.parentNode instanceof HTMLElement&&e.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var n=e.parentNode.parentNode,r=t.children[t.children.length-1];n.style.webkitOverflowScrolling="",r.style.webkitOverflowScrolling="touch"}})},e.prototype.update=function(e){var t=e.target;if(!(t instanceof HTMLElement))throw new ReferenceError;var n=t.nextElementSibling;if(!(n instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==n.tagName&&n.nextElementSibling;)n=n.nextElementSibling;if(!(t.parentNode instanceof HTMLElement&&t.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var r=t.parentNode.parentNode,i=n.children[n.children.length-1];if(r.style.webkitOverflowScrolling="",i.style.webkitOverflowScrolling="",!t.checked){var o=function e(){n instanceof HTMLElement&&(r.style.webkitOverflowScrolling="touch",n.removeEventListener("transitionend",e))};n.addEventListener("transitionend",o,!1)}if(t.checked){var a=function e(){n instanceof HTMLElement&&(i.style.webkitOverflowScrolling="touch",n.removeEventListener("transitionend",e))};n.addEventListener("transitionend",a,!1)}},e.prototype.reset=function(){this.el_.children[1].style.webkitOverflowScrolling="";var e=this.el_.querySelectorAll("[data-md-toggle]");Array.prototype.forEach.call(e,function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=e.nextElementSibling;if(!(t instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==t.tagName&&t.nextElementSibling;)t=t.nextElementSibling;if(!(e.parentNode instanceof HTMLElement&&e.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var n=e.parentNode.parentNode,r=t.children[t.children.length-1];n.style.webkitOverflowScrolling="",r.style.webkitOverflowScrolling=""}})},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(32),o=r(i),a=n(33),s=r(a);t.default={Lock:o.default,Result:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLInputElement))throw new ReferenceError;if(this.el_=n,!document.body)throw new ReferenceError;this.lock_=document.body}return e.prototype.setup=function(){this.update()},e.prototype.update=function(){var e=this;this.el_.checked?(this.offset_=window.pageYOffset,setTimeout(function(){window.scrollTo(0,0),e.el_.checked&&(e.lock_.dataset.mdState="lock")},400)):(this.lock_.dataset.mdState="",setTimeout(function(){void 0!==e.offset_&&window.scrollTo(0,e.offset_)},100))},e.prototype.reset=function(){"lock"===this.lock_.dataset.mdState&&window.scrollTo(0,this.offset_),this.lock_.dataset.mdState=""},e}();t.default=i},function(e,t,n){"use strict";(function(e){function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var o=n(34),a=r(o),s=n(35),c=r(s),u=function(e,t){var n=t;if(e.length>n){for(;" "!==e[n]&&--n>0;);return e.substring(0,n)+"..."}return e},l=function(e){var t=document.getElementsByName("lang:"+e)[0];if(!(t instanceof HTMLMetaElement))throw new ReferenceError;return t.content},d=function(){function t(e,n){i(this,t);var r="string"==typeof e?document.querySelector(e):e;if(!(r instanceof HTMLElement))throw new ReferenceError;this.el_=r;var o=Array.prototype.slice.call(this.el_.children),a=o[0],s=o[1];this.data_=n,this.meta_=a,this.list_=s,this.message_={placeholder:this.meta_.textContent,none:l("search.result.none"),one:l("search.result.one"),other:l("search.result.other")};var u=l("search.tokenizer");u.length&&(c.default.tokenizer.separator=u),this.lang_=l("search.language").split(",").filter(Boolean).map(function(e){return e.trim()})}return t.prototype.update=function(t){var n=this;if("focus"!==t.type||this.index_){if("focus"===t.type||"keyup"===t.type){var r=t.target;if(!(r instanceof HTMLInputElement))throw new ReferenceError;if(!this.index_||r.value===this.value_)return;for(;this.list_.firstChild;)this.list_.removeChild(this.list_.firstChild);if(this.value_=r.value,0===this.value_.length)return void(this.meta_.textContent=this.message_.placeholder);var i=this.index_.query(function(e){n.value_.toLowerCase().split(" ").filter(Boolean).forEach(function(t){e.term(t,{wildcard:c.default.Query.wildcard.TRAILING})})}).reduce(function(e,t){var r=n.docs_.get(t.ref);if(r.parent){var i=r.parent.location;e.set(i,(e.get(i)||[]).concat(t))}else{var o=r.location;e.set(o,e.get(o)||[])}return e},new Map),o=(0,a.default)(this.value_.trim()).replace(new RegExp(c.default.tokenizer.separator,"img"),"|"),s=new RegExp("(^|"+c.default.tokenizer.separator+")("+o+")","img"),d=function(e,t,n){return t+""+n+""};this.stack_=[],i.forEach(function(t,r){var i,o=n.docs_.get(r),a=e.createElement("li",{class:"md-search-result__item"},e.createElement("a",{href:o.location,title:o.title,class:"md-search-result__link",tabindex:"-1"},e.createElement("article",{class:"md-search-result__article md-search-result__article--document"},e.createElement("h1",{class:"md-search-result__title"},{__html:o.title.replace(s,d)}),o.text.length?e.createElement("p",{class:"md-search-result__teaser"},{__html:o.text.replace(s,d)}):{}))),c=t.map(function(t){return function(){var r=n.docs_.get(t.ref);a.appendChild(e.createElement("a",{href:r.location,title:r.title,class:"md-search-result__link","data-md-rel":"anchor",tabindex:"-1"},e.createElement("article",{class:"md-search-result__article"},e.createElement("h1",{class:"md-search-result__title"},{__html:r.title.replace(s,d)}),r.text.length?e.createElement("p",{class:"md-search-result__teaser"},{__html:u(r.text.replace(s,d),400)}):{})))}});(i=n.stack_).push.apply(i,[function(){return n.list_.appendChild(a)}].concat(c))});var f=this.el_.parentNode;if(!(f instanceof HTMLElement))throw new ReferenceError;for(;this.stack_.length&&f.offsetHeight>=f.scrollHeight-16;)this.stack_.shift()();var h=this.list_.querySelectorAll("[data-md-rel=anchor]");switch(Array.prototype.forEach.call(h,function(e){["click","keydown"].forEach(function(t){e.addEventListener(t,function(n){if("keydown"!==t||13===n.keyCode){var r=document.querySelector("[data-md-toggle=search]");if(!(r instanceof HTMLInputElement))throw new ReferenceError;r.checked&&(r.checked=!1,r.dispatchEvent(new CustomEvent("change"))),n.preventDefault(),setTimeout(function(){document.location.href=e.href},100)}})})}),i.size){case 0:this.meta_.textContent=this.message_.none;break;case 1:this.meta_.textContent=this.message_.one;break;default:this.meta_.textContent=this.message_.other.replace("#",i.size)}}}else{var p=function(e){n.docs_=e.reduce(function(e,t){var n=t.location.split("#"),r=n[0];return n[1]&&(t.parent=e.get(r),t.parent&&!t.parent.done&&(t.parent.title=t.title,t.parent.text=t.text,t.parent.done=!0)),t.text=t.text.replace(/\n/g," ").replace(/\s+/g," ").replace(/\s+([,.:;!?])/g,function(e,t){return t}),t.parent&&t.parent.title===t.title||e.set(t.location,t),e},new Map);var t=n.docs_,r=n.lang_;n.stack_=[],n.index_=(0,c.default)(function(){var e,n=this,i={"search.pipeline.trimmer":c.default.trimmer,"search.pipeline.stopwords":c.default.stopWordFilter},o=Object.keys(i).reduce(function(e,t){return l(t).match(/^false$/i)||e.push(i[t]),e},[]);this.pipeline.reset(),o&&(e=this.pipeline).add.apply(e,o),1===r.length&&"en"!==r[0]&&c.default[r[0]]?this.use(c.default[r[0]]):r.length>1&&this.use(c.default.multiLanguage.apply(c.default,r)),this.field("title",{boost:10}),this.field("text"),this.ref("location"),t.forEach(function(e){return n.add(e)})});var i=n.el_.parentNode;if(!(i instanceof HTMLElement))throw new ReferenceError;i.addEventListener("scroll",function(){for(;n.stack_.length&&i.scrollTop+i.offsetHeight>=i.scrollHeight-16;)n.stack_.splice(0,10).forEach(function(e){return e()})})};setTimeout(function(){return"function"==typeof n.data_?n.data_().then(p):p(n.data_)},250)}},t}();t.default=d}).call(t,n(0))},function(e,t,n){"use strict";var r=/[|\\{}()[\]^$+*?.]/g;e.exports=function(e){if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(r,"\\$&")}},function(e,t,n){(function(t){e.exports=t.lunr=n(36)}).call(t,n(1))},function(e,t,n){var r,i;!function(){var o=function(e){var t=new o.Builder;return t.pipeline.add(o.trimmer,o.stopWordFilter,o.stemmer),t.searchPipeline.add(o.stemmer),e.call(t,t),t.build()};o.version="2.1.5",o.utils={},o.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),o.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},o.FieldRef=function(e,t,n){this.docRef=e,this.fieldName=t,this._stringValue=n},o.FieldRef.joiner="/",o.FieldRef.fromString=function(e){var t=e.indexOf(o.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var n=e.slice(0,t),r=e.slice(t+1);return new o.FieldRef(r,n,e)},o.FieldRef.prototype.toString=function(){return void 0==this._stringValue&&(this._stringValue=this.fieldName+o.FieldRef.joiner+this.docRef),this._stringValue},o.idf=function(e,t){var n=0;for(var r in e)"_index"!=r&&(n+=Object.keys(e[r]).length);var i=(t-n+.5)/(n+.5);return Math.log(1+Math.abs(i))},o.Token=function(e,t){this.str=e||"",this.metadata=t||{}},o.Token.prototype.toString=function(){return this.str},o.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},o.Token.prototype.clone=function(e){return e=e||function(e){return e},new o.Token(e(this.str,this.metadata),this.metadata)},o.tokenizer=function(e){if(null==e||void 0==e)return[];if(Array.isArray(e))return e.map(function(e){return new o.Token(o.utils.asString(e).toLowerCase())});for(var t=e.toString().trim().toLowerCase(),n=t.length,r=[],i=0,a=0;i<=n;i++){var s=t.charAt(i),c=i-a;(s.match(o.tokenizer.separator)||i==n)&&(c>0&&r.push(new o.Token(t.slice(a,i),{position:[a,c],index:r.length})),a=i+1)}return r},o.tokenizer.separator=/[\s\-]+/,o.Pipeline=function(){this._stack=[]},o.Pipeline.registeredFunctions=Object.create(null),o.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&o.utils.warn("Overwriting existing registered function: "+t),e.label=t,o.Pipeline.registeredFunctions[e.label]=e},o.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||o.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},o.Pipeline.load=function(e){var t=new o.Pipeline;return e.forEach(function(e){var n=o.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)}),t},o.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){o.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},o.Pipeline.prototype.after=function(e,t){o.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},o.Pipeline.prototype.before=function(e,t){o.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},o.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},o.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=i),o!=e);)r=n-t,i=t+Math.floor(r/2),o=this.elements[2*i];return o==e?2*i:o>e?2*i:os?u+=2:a==s&&(t+=n[c+1]*r[u+1],c+=2,u+=2);return t},o.Vector.prototype.similarity=function(e){return this.dot(e)/(this.magnitude()*e.magnitude())},o.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,s=i.str.charAt(0);s in i.node.edges?a=i.node.edges[s]:(a=new o.TokenSet,i.node.edges[s]=a),1==i.str.length?a.final=!0:r.push({node:a,editsRemaining:i.editsRemaining,str:i.str.slice(1)})}if(i.editsRemaining>0&&i.str.length>1){var c,s=i.str.charAt(1);s in i.node.edges?c=i.node.edges[s]:(c=new o.TokenSet,i.node.edges[s]=c),i.str.length<=2?c.final=!0:r.push({node:c,editsRemaining:i.editsRemaining-1,str:i.str.slice(2)})}if(i.editsRemaining>0&&1==i.str.length&&(i.node.final=!0),i.editsRemaining>0&&i.str.length>=1){if("*"in i.node.edges)var u=i.node.edges["*"];else{var u=new o.TokenSet;i.node.edges["*"]=u}1==i.str.length?u.final=!0:r.push({node:u,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)})}if(i.editsRemaining>0){if("*"in i.node.edges)var l=i.node.edges["*"];else{var l=new o.TokenSet;i.node.edges["*"]=l}0==i.str.length?l.final=!0:r.push({node:l,editsRemaining:i.editsRemaining-1,str:i.str})}if(i.editsRemaining>0&&i.str.length>1){var d,f=i.str.charAt(0),h=i.str.charAt(1);h in i.node.edges?d=i.node.edges[h]:(d=new o.TokenSet,i.node.edges[h]=d),1==i.str.length?d.final=!0:r.push({node:d,editsRemaining:i.editsRemaining-1,str:f+i.str.slice(2)})}}return n},o.TokenSet.fromString=function(e){for(var t=new o.TokenSet,n=t,r=!1,i=0,a=e.length;i=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},o.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},o.Index.prototype.search=function(e){return this.query(function(t){new o.QueryParser(e,t).parse()})},o.Index.prototype.query=function(e){var t=new o.Query(this.fields),n=Object.create(null),r=Object.create(null),i=Object.create(null);e.call(t,t);for(var a=0;a1?1:e},o.Builder.prototype.k1=function(e){this._k1=e},o.Builder.prototype.add=function(e){var t=e[this._ref];this.documentCount+=1;for(var n=0;n=this.length)return o.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},o.QueryLexer.prototype.width=function(){return this.pos-this.start},o.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},o.QueryLexer.prototype.backup=function(){this.pos-=1},o.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{e=this.next(),t=e.charCodeAt(0)}while(t>47&&t<58);e!=o.QueryLexer.EOS&&this.backup()},o.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(o.QueryLexer.TERM)),e.ignore(),e.more())return o.QueryLexer.lexText},o.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(o.QueryLexer.EDIT_DISTANCE),o.QueryLexer.lexText},o.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(o.QueryLexer.BOOST),o.QueryLexer.lexText},o.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(o.QueryLexer.TERM)},o.QueryLexer.termSeparator=o.tokenizer.separator,o.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==o.QueryLexer.EOS)return o.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return o.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(o.QueryLexer.TERM),o.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(o.QueryLexer.TERM),o.QueryLexer.lexBoost;if(t.match(o.QueryLexer.termSeparator))return o.QueryLexer.lexTerm}else e.escapeCharacter()}},o.QueryParser=function(e,t){this.lexer=new o.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},o.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=o.QueryParser.parseFieldOrTerm;e;)e=e(this);return this.query},o.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},o.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},o.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},o.QueryParser.parseFieldOrTerm=function(e){var t=e.peekLexeme();if(void 0!=t)switch(t.type){case o.QueryLexer.FIELD:return o.QueryParser.parseField;case o.QueryLexer.TERM:return o.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new o.QueryParseError(n,t.start,t.end)}},o.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(void 0!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var i=e.peekLexeme();if(void 0==i){var r="expecting term, found nothing";throw new o.QueryParseError(r,t.start,t.end)}switch(i.type){case o.QueryLexer.TERM:return o.QueryParser.parseTerm;default:var r="expecting term, found '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},o.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(void 0!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(void 0==n)return void e.nextClause();switch(n.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+n.type+"'";throw new o.QueryParseError(r,n.start,n.end)}}},o.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var i=e.peekLexeme();if(void 0==i)return void e.nextClause();switch(i.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},o.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var i=e.peekLexeme();if(void 0==i)return void e.nextClause();switch(i.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},function(o,a){r=a,void 0!==(i="function"==typeof r?r.call(t,n,t,e):r)&&(e.exports=i)}(0,function(){return o})}()},function(e,t,n){"use strict";t.__esModule=!0;var r=n(38),i=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default={Position:i.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement&&i.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=i,this.parent_=i.parentNode,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLElement))throw new ReferenceError;this.header_=i,this.height_=0,this.pad_="fixed"===window.getComputedStyle(this.header_).position}return e.prototype.setup=function(){var e=Array.prototype.reduce.call(this.parent_.children,function(e,t){return Math.max(e,t.offsetTop)},0);this.offset_=e-(this.pad_?this.header_.offsetHeight:0),this.update()},e.prototype.update=function(e){var t=window.pageYOffset,n=window.innerHeight;e&&"resize"===e.type&&this.setup();var r={top:this.pad_?this.header_.offsetHeight:0,bottom:this.parent_.offsetTop+this.parent_.offsetHeight},i=n-r.top-Math.max(0,this.offset_-t)-Math.max(0,t+n-r.bottom);i!==this.height_&&(this.el_.style.height=(this.height_=i)+"px"),t>=this.offset_?"lock"!==this.el_.dataset.mdState&&(this.el_.dataset.mdState="lock"):"lock"===this.el_.dataset.mdState&&(this.el_.dataset.mdState="")},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.height="",this.height_=0},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(40),o=r(i),a=n(44),s=r(a);t.default={Adapter:o.default,Repository:s.default}},function(e,t,n){"use strict";t.__esModule=!0;var r=n(41),i=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default={GitHub:i.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var a=n(42),s=function(e){return e&&e.__esModule?e:{default:e}}(a),c=function(e){function t(n){r(this,t);var o=i(this,e.call(this,n)),a=/^.+github\.com\/([^\/]+)\/?([^\/]+)?.*$/.exec(o.base_);if(a&&3===a.length){var s=a[1],c=a[2];o.base_="https://api.github.com/users/"+s+"/repos",o.name_=c}return o}return o(t,e),t.prototype.fetch_=function(){var e=this;return function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return fetch(e.base_+"?per_page=30&page="+n).then(function(e){return e.json()}).then(function(r){if(!(r instanceof Array))throw new TypeError;if(e.name_){var i=r.find(function(t){return t.name===e.name_});return i||30!==r.length?i?[e.format_(i.stargazers_count)+" Stars",e.format_(i.forks_count)+" Forks"]:[]:t(n+1)}return[r.length+" Repositories"]})}()},t}(s.default);t.default=c},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(43),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLAnchorElement))throw new ReferenceError;this.el_=n,this.base_=this.el_.href,this.salt_=this.hash_(this.base_)}return e.prototype.fetch=function(){var e=this;return new Promise(function(t){var n=o.default.getJSON(e.salt_+".cache-source");void 0!==n?t(n):e.fetch_().then(function(n){o.default.set(e.salt_+".cache-source",n,{expires:1/96}),t(n)})})},e.prototype.fetch_=function(){throw new Error("fetch_(): Not implemented")},e.prototype.format_=function(e){return e>1e4?(e/1e3).toFixed(0)+"k":e>1e3?(e/1e3).toFixed(1)+"k":""+e},e.prototype.hash_=function(e){var t=0;if(0===e.length)return t;for(var n=0,r=e.length;n1){if(o=e({path:"/"},r.defaults,o),"number"==typeof o.expires){var s=new Date;s.setMilliseconds(s.getMilliseconds()+864e5*o.expires),o.expires=s}o.expires=o.expires?o.expires.toUTCString():"";try{a=JSON.stringify(i),/^[\{\[]/.test(a)&&(i=a)}catch(e){}i=n.write?n.write(i,t):encodeURIComponent(String(i)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),t=encodeURIComponent(String(t)),t=t.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),t=t.replace(/[\(\)]/g,escape);var c="";for(var u in o)o[u]&&(c+="; "+u,!0!==o[u]&&(c+="="+o[u]));return document.cookie=t+"="+i+c}t||(a={});for(var l=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,f=0;f=this.el_.children[0].offsetTop+-43;e!==this.active_&&(this.el_.dataset.mdState=(this.active_=e)?"hidden":"")},e.prototype.reset=function(){this.el_.dataset.mdState="",this.active_=!1},e}();t.default=i}])); \ No newline at end of file diff --git a/assets/javascripts/modernizr.1aa3b519.js b/assets/javascripts/modernizr.1aa3b519.js new file mode 100644 index 0000000000..1c9acd4011 --- /dev/null +++ b/assets/javascripts/modernizr.1aa3b519.js @@ -0,0 +1,2 @@ +/*! Modernizr 3.5.0 | MIT */ +!function(e,t){for(var n in t)e[n]=t[n]}(window,function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}({4:function(e,t,n){"use strict";n(5)},5:function(e,t){!function(t){!function(e,t,n){function r(e,t){return typeof e===t}function o(e){var t=_.className,n=C._config.classPrefix||"";if(T&&(t=t.baseVal),C._config.enableJSClass){var r=new RegExp("(^|\\s)"+n+"no-js(\\s|$)");t=t.replace(r,"$1"+n+"js$2")}C._config.enableClasses&&(t+=" "+n+e.join(" "+n),T?_.className.baseVal=t:_.className=t)}function i(e,t){if("object"==typeof e)for(var n in e)b(e,n)&&i(n,e[n]);else{e=e.toLowerCase();var r=e.split("."),s=C[r[0]];if(2==r.length&&(s=s[r[1]]),void 0!==s)return C;t="function"==typeof t?t():t,1==r.length?C[r[0]]=t:(!C[r[0]]||C[r[0]]instanceof Boolean||(C[r[0]]=new Boolean(C[r[0]])),C[r[0]][r[1]]=t),o([(t&&0!=t?"":"no-")+r.join("-")]),C._trigger(e,t)}return C}function s(){return"function"!=typeof t.createElement?t.createElement(arguments[0]):T?t.createElementNS.call(t,"http://www.w3.org/2000/svg",arguments[0]):t.createElement.apply(t,arguments)}function a(){var e=t.body;return e||(e=s(T?"svg":"body"),e.fake=!0),e}function u(e,n,r,o){var i,u,l,f,c="modernizr",d=s("div"),p=a();if(parseInt(r,10))for(;r--;)l=s("div"),l.id=o?o[r]:c+(r+1),d.appendChild(l);return i=s("style"),i.type="text/css",i.id="s"+c,(p.fake?p:d).appendChild(i),p.appendChild(d),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(t.createTextNode(e)),d.id=c,p.fake&&(p.style.background="",p.style.overflow="hidden",f=_.style.overflow,_.style.overflow="hidden",_.appendChild(p)),u=n(d,e),p.fake?(p.parentNode.removeChild(p),_.style.overflow=f,_.offsetHeight):d.parentNode.removeChild(d),!!u}function l(e,t){return!!~(""+e).indexOf(t)}function f(e){return e.replace(/([A-Z])/g,function(e,t){return"-"+t.toLowerCase()}).replace(/^ms-/,"-ms-")}function c(t,n,r){var o;if("getComputedStyle"in e){o=getComputedStyle.call(e,t,n);var i=e.console;if(null!==o)r&&(o=o.getPropertyValue(r));else if(i){var s=i.error?"error":"log";i[s].call(i,"getComputedStyle returning null, its possible modernizr test results are inaccurate")}}else o=!n&&t.currentStyle&&t.currentStyle[r];return o}function d(t,r){var o=t.length;if("CSS"in e&&"supports"in e.CSS){for(;o--;)if(e.CSS.supports(f(t[o]),r))return!0;return!1}if("CSSSupportsRule"in e){for(var i=[];o--;)i.push("("+f(t[o])+":"+r+")");return i=i.join(" or "),u("@supports ("+i+") { #modernizr { position: absolute; } }",function(e){return"absolute"==c(e,null,"position")})}return n}function p(e){return e.replace(/([a-z])-([a-z])/g,function(e,t,n){return t+n.toUpperCase()}).replace(/^-/,"")}function h(e,t,o,i){function a(){f&&(delete j.style,delete j.modElem)}if(i=!r(i,"undefined")&&i,!r(o,"undefined")){var u=d(e,o);if(!r(u,"undefined"))return u}for(var f,c,h,m,v,g=["modernizr","tspan","samp"];!j.style&&g.length;)f=!0,j.modElem=s(g.shift()),j.style=j.modElem.style;for(h=e.length,c=0;h>c;c++)if(m=e[c],v=j.style[m],l(m,"-")&&(m=p(m)),j.style[m]!==n){if(i||r(o,"undefined"))return a(),"pfx"!=t||m;try{j.style[m]=o}catch(e){}if(j.style[m]!=v)return a(),"pfx"!=t||m}return a(),!1}function m(e,t){return function(){return e.apply(t,arguments)}}function v(e,t,n){var o;for(var i in e)if(e[i]in t)return!1===n?e[i]:(o=t[e[i]],r(o,"function")?m(o,n||t):o);return!1}function g(e,t,n,o,i){var s=e.charAt(0).toUpperCase()+e.slice(1),a=(e+" "+k.join(s+" ")+s).split(" ");return r(t,"string")||r(t,"undefined")?h(a,t,o,i):(a=(e+" "+A.join(s+" ")+s).split(" "),v(a,t,n))}function y(e,t,r){return g(e,n,n,t,r)}var w=[],S={_version:"3.5.0",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,t){var n=this;setTimeout(function(){t(n[e])},0)},addTest:function(e,t,n){w.push({name:e,fn:t,options:n})},addAsyncTest:function(e){w.push({name:null,fn:e})}},C=function(){};C.prototype=S,C=new C;var b,x=[],_=t.documentElement,T="svg"===_.nodeName.toLowerCase();!function(){var e={}.hasOwnProperty;b=r(e,"undefined")||r(e.call,"undefined")?function(e,t){return t in e&&r(e.constructor.prototype[t],"undefined")}:function(t,n){return e.call(t,n)}}(),S._l={},S.on=function(e,t){this._l[e]||(this._l[e]=[]),this._l[e].push(t),C.hasOwnProperty(e)&&setTimeout(function(){C._trigger(e,C[e])},0)},S._trigger=function(e,t){if(this._l[e]){var n=this._l[e];setTimeout(function(){var e;for(e=0;e ammonition + document.querySelectorAll('.callout').forEach(callout => { + callout.classList.add('admonition') + callout.querySelectorAll('.callout-title').forEach(title => { + title.classList.add('admonition-title') + }) + callout.style.visibility = 'visible'; + }) + + var headers = ['h2', 'h3', 'h4', 'h5', 'h6'] + headers.forEach(headerName => { + document.querySelectorAll(headerName).forEach(header => { + var link = header.querySelector('a') + if (link) { + header.id = link.name + link.name = '' + header.removeChild(link) + link.text = '¶' + link.title = 'Permanent link' + link.className = 'headerlink' + header.appendChild(link) + } + }) + }) + + document.querySelectorAll('nav.md-nav--primary > ul').forEach((root, rootIndex) => { + function createNavToggle(path, active) { + var input = document.createElement('input') + input.classList.add('md-toggle') + input.classList.add('md-nav__toggle') + input.type = 'checkbox' + input.id = path + input.checked = active || false + input.setAttribute('data-md-toggle', path) + return input + } + + function createNavLabel(path, active, contentNode) { + var label = document.createElement('label') + label.classList.add('md-nav__link') + if (active) + label.classList.add('md-nav__link--active') + label.setAttribute('for', path) + if (contentNode) + label.appendChild(contentNode) + return label + } + + function visitListItem(item, path, level) { + item.classList.add('md-nav__item') + + var link = item.querySelector(':scope > a') + if (link) { + link.classList.add('md-nav__link') + link.classList.remove('page') + if (link.classList.contains('active')) { + item.classList.add('md-nav__item--active') + link.classList.add('md-nav__link--active') + } + link.setAttribute('data-md-state', '') + } + + var nestedNav = null + var nestedRoot = item.querySelector(':scope > ul') + if (nestedRoot) { + var active = item.querySelector(':scope a.active') != null + item.classList.add('md-nav__item--nested') + var nestedNav = document.createElement('nav') + nestedNav.classList.add('md-nav') + nestedNav.setAttribute('data-md-component', 'collapsible') + nestedNav.setAttribute('data-md-level', level) + + var input = createNavToggle(path, active) + + var label = createNavLabel(path, false, link) + if (link) + link.classList.remove('md-nav__link') + + var labelInner = document.createElement('label') + labelInner.classList.add('md-nav__title') + labelInner.setAttribute('for', path) + labelInner.textContent = link ? link.textContent : '???' + + nestedNav.appendChild(labelInner) + nestedNav.appendChild(nestedRoot) + item.appendChild(input) + item.appendChild(label) + item.appendChild(nestedNav) + visitList(nestedRoot, path, level + 1) + } + + if (link && link.classList.contains('active')) { + var toc = document.querySelector('nav.md-nav--primary > .md-nav--secondary') + if (toc && toc.children.length > 0) { + var input = createNavToggle('__toc', false) + var labelText = nestedNav ? 'Table of contents' : link ? link.textContent : '???' + var label = createNavLabel('__toc', true, document.createTextNode(labelText)) + + if (nestedNav) { + var node = nestedNav.children[1] + nestedNav.insertBefore(input, node) + nestedNav.insertBefore(label, node) + nestedNav.appendChild(toc) + } else if (link) { + item.insertBefore(input, link) + item.insertBefore(label, link) + item.appendChild(toc) + } + } + } + } + + function visitList(list, path, level) { + list.classList.add('md-nav__list') + list.setAttribute('data-md-scrollfix', '') + list.querySelectorAll('li').forEach((item, itemIndex) => { + visitListItem(item, path + '-' + itemIndex, level) + }) + } + + visitList(root, 'nav-' + rootIndex, 1) + var projectVersion = document.getElementById("project.version") + if (projectVersion) { + root.appendChild(projectVersion) + } + root.parentNode.style.visibility = 'visible' + }) + + document.querySelectorAll('.md-sidebar--secondary .md-nav--secondary > ul').forEach(tocRoot => { + function visitListItem(item) { + item.classList.add('md-nav__item') + item.querySelectorAll(':scope> a').forEach(link => { + link.classList.add('md-nav__link') + link.setAttribute('data-md-state', '') + }) + item.querySelectorAll(':scope > ul').forEach(list => { + visitList(list) + }) + } + + function visitList(list) { + list.classList.add('md-nav__list') + list.querySelectorAll(':scope > li').forEach(item => { + visitListItem(item) + }) + } + + var parent = tocRoot.parentNode + parent.removeChild(tocRoot) + + tocRoot.querySelectorAll(':scope > li > ul').forEach(list => { + parent.append(list) + list.setAttribute('data-md-scrollfix', '') + visitList(list) + }) + + parent.style.visibility = 'visible'; + }) + + document.querySelectorAll('dl').forEach(dl => { + const tabContents = dl.querySelectorAll(':scope > dd > pre') + if (tabContents.length > 0) { + dl.classList.add('mdc-tab-bar') + var first = true + var contentContainer = document.createElement('div') + contentContainer.classList.add('mdc-tab-content-container') + + tabContents.forEach(pre => { + var dd = pre.parentNode + var dt = dd.previousSibling + while (dt.nodeType != dt.ELEMENT_NODE) { + dt = dt.previousSibling + } + + var tabContent = document.createElement('div') + tabContent.classList.add('mdc-tab-content') + contentContainer.appendChild(tabContent) + while (dd.childNodes.length > 0) { + tabContent.appendChild(dd.childNodes[0]); + } + dl.removeChild(dd) + + dt.classList.add('mdc-tab') + if (first) { + dt.classList.add('mdc-tab--active') + tabContent.classList.add('mdc-tab-content--active') + } + first = false + dt.onclick = event => { + dl.querySelectorAll(':scope .mdc-tab--active').forEach(active => { + active.classList.remove('mdc-tab--active') + }) + contentContainer.querySelectorAll(':scope .mdc-tab-content--active').forEach(active => { + active.classList.remove('mdc-tab-content--active') + }) + dt.classList.add('mdc-tab--active') + tabContent.classList.add('mdc-tab-content--active') + } + }) + + if (dl.nextSibling) + dl.parentNode.insertBefore(contentContainer, dl.nextSibling) + else + dl.parentNode.appendChild(contentContainer) + } + }) +} + +initParadoxMaterialTheme() diff --git a/assets/stylesheets/application-palette.22915126.css b/assets/stylesheets/application-palette.22915126.css new file mode 100644 index 0000000000..c5af7f5804 --- /dev/null +++ b/assets/stylesheets/application-palette.22915126.css @@ -0,0 +1,1181 @@ +/*! + Material for MkDocs + Copyright (c) 2016-2018 Martin Donath + License: MIT +*/ +button[data-md-color-primary], +button[data-md-color-accent] { + width: 13rem; + margin-bottom: 0.4rem; + padding: 2.4rem 0.8rem 0.4rem; + transition: background-color 0.25s, opacity 0.25s; + border-radius: 0.2rem; + color: white; + font-size: 1.28rem; + text-align: left; + cursor: pointer; } + button[data-md-color-primary]:hover, + button[data-md-color-accent]:hover { + opacity: 0.75; } + +button[data-md-color-primary="red"] { + background-color: #ef5350; } + +[data-md-color-primary="red"] .md-typeset a { + color: #ef5350; } + +[data-md-color-primary="red"] .md-header { + background-color: #ef5350; } + +[data-md-color-primary="red"] .md-hero { + background-color: #ef5350; } + +[data-md-color-primary="red"] .md-nav__link:active, +[data-md-color-primary="red"] .md-nav__link--active { + color: #ef5350; } + +[data-md-color-primary="red"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="pink"] { + background-color: #e91e63; } + +[data-md-color-primary="pink"] .md-typeset a { + color: #e91e63; } + +[data-md-color-primary="pink"] .md-header { + background-color: #e91e63; } + +[data-md-color-primary="pink"] .md-hero { + background-color: #e91e63; } + +[data-md-color-primary="pink"] .md-nav__link:active, +[data-md-color-primary="pink"] .md-nav__link--active { + color: #e91e63; } + +[data-md-color-primary="pink"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="purple"] { + background-color: #ab47bc; } + +[data-md-color-primary="purple"] .md-typeset a { + color: #ab47bc; } + +[data-md-color-primary="purple"] .md-header { + background-color: #ab47bc; } + +[data-md-color-primary="purple"] .md-hero { + background-color: #ab47bc; } + +[data-md-color-primary="purple"] .md-nav__link:active, +[data-md-color-primary="purple"] .md-nav__link--active { + color: #ab47bc; } + +[data-md-color-primary="purple"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="deep-purple"] { + background-color: #7e57c2; } + +[data-md-color-primary="deep-purple"] .md-typeset a { + color: #7e57c2; } + +[data-md-color-primary="deep-purple"] .md-header { + background-color: #7e57c2; } + +[data-md-color-primary="deep-purple"] .md-hero { + background-color: #7e57c2; } + +[data-md-color-primary="deep-purple"] .md-nav__link:active, +[data-md-color-primary="deep-purple"] .md-nav__link--active { + color: #7e57c2; } + +[data-md-color-primary="deep-purple"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="indigo"] { + background-color: #3f51b5; } + +[data-md-color-primary="indigo"] .md-typeset a { + color: #3f51b5; } + +[data-md-color-primary="indigo"] .md-header { + background-color: #3f51b5; } + +[data-md-color-primary="indigo"] .md-hero { + background-color: #3f51b5; } + +[data-md-color-primary="indigo"] .md-nav__link:active, +[data-md-color-primary="indigo"] .md-nav__link--active { + color: #3f51b5; } + +[data-md-color-primary="indigo"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="blue"] { + background-color: #2196f3; } + +[data-md-color-primary="blue"] .md-typeset a { + color: #2196f3; } + +[data-md-color-primary="blue"] .md-header { + background-color: #2196f3; } + +[data-md-color-primary="blue"] .md-hero { + background-color: #2196f3; } + +[data-md-color-primary="blue"] .md-nav__link:active, +[data-md-color-primary="blue"] .md-nav__link--active { + color: #2196f3; } + +[data-md-color-primary="blue"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="light-blue"] { + background-color: #03a9f4; } + +[data-md-color-primary="light-blue"] .md-typeset a { + color: #03a9f4; } + +[data-md-color-primary="light-blue"] .md-header { + background-color: #03a9f4; } + +[data-md-color-primary="light-blue"] .md-hero { + background-color: #03a9f4; } + +[data-md-color-primary="light-blue"] .md-nav__link:active, +[data-md-color-primary="light-blue"] .md-nav__link--active { + color: #03a9f4; } + +[data-md-color-primary="light-blue"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="cyan"] { + background-color: #00bcd4; } + +[data-md-color-primary="cyan"] .md-typeset a { + color: #00bcd4; } + +[data-md-color-primary="cyan"] .md-header { + background-color: #00bcd4; } + +[data-md-color-primary="cyan"] .md-hero { + background-color: #00bcd4; } + +[data-md-color-primary="cyan"] .md-nav__link:active, +[data-md-color-primary="cyan"] .md-nav__link--active { + color: #00bcd4; } + +[data-md-color-primary="cyan"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="teal"] { + background-color: #009688; } + +[data-md-color-primary="teal"] .md-typeset a { + color: #009688; } + +[data-md-color-primary="teal"] .md-header { + background-color: #009688; } + +[data-md-color-primary="teal"] .md-hero { + background-color: #009688; } + +[data-md-color-primary="teal"] .md-nav__link:active, +[data-md-color-primary="teal"] .md-nav__link--active { + color: #009688; } + +[data-md-color-primary="teal"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="green"] { + background-color: #4caf50; } + +[data-md-color-primary="green"] .md-typeset a { + color: #4caf50; } + +[data-md-color-primary="green"] .md-header { + background-color: #4caf50; } + +[data-md-color-primary="green"] .md-hero { + background-color: #4caf50; } + +[data-md-color-primary="green"] .md-nav__link:active, +[data-md-color-primary="green"] .md-nav__link--active { + color: #4caf50; } + +[data-md-color-primary="green"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="light-green"] { + background-color: #7cb342; } + +[data-md-color-primary="light-green"] .md-typeset a { + color: #7cb342; } + +[data-md-color-primary="light-green"] .md-header { + background-color: #7cb342; } + +[data-md-color-primary="light-green"] .md-hero { + background-color: #7cb342; } + +[data-md-color-primary="light-green"] .md-nav__link:active, +[data-md-color-primary="light-green"] .md-nav__link--active { + color: #7cb342; } + +[data-md-color-primary="light-green"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="lime"] { + background-color: #c0ca33; } + +[data-md-color-primary="lime"] .md-typeset a { + color: #c0ca33; } + +[data-md-color-primary="lime"] .md-header { + background-color: #c0ca33; } + +[data-md-color-primary="lime"] .md-hero { + background-color: #c0ca33; } + +[data-md-color-primary="lime"] .md-nav__link:active, +[data-md-color-primary="lime"] .md-nav__link--active { + color: #c0ca33; } + +[data-md-color-primary="lime"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="yellow"] { + background-color: #f9a825; } + +[data-md-color-primary="yellow"] .md-typeset a { + color: #f9a825; } + +[data-md-color-primary="yellow"] .md-header { + background-color: #f9a825; } + +[data-md-color-primary="yellow"] .md-hero { + background-color: #f9a825; } + +[data-md-color-primary="yellow"] .md-nav__link:active, +[data-md-color-primary="yellow"] .md-nav__link--active { + color: #f9a825; } + +[data-md-color-primary="yellow"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="amber"] { + background-color: #ffa000; } + +[data-md-color-primary="amber"] .md-typeset a { + color: #ffa000; } + +[data-md-color-primary="amber"] .md-header { + background-color: #ffa000; } + +[data-md-color-primary="amber"] .md-hero { + background-color: #ffa000; } + +[data-md-color-primary="amber"] .md-nav__link:active, +[data-md-color-primary="amber"] .md-nav__link--active { + color: #ffa000; } + +[data-md-color-primary="amber"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="orange"] { + background-color: #fb8c00; } + +[data-md-color-primary="orange"] .md-typeset a { + color: #fb8c00; } + +[data-md-color-primary="orange"] .md-header { + background-color: #fb8c00; } + +[data-md-color-primary="orange"] .md-hero { + background-color: #fb8c00; } + +[data-md-color-primary="orange"] .md-nav__link:active, +[data-md-color-primary="orange"] .md-nav__link--active { + color: #fb8c00; } + +[data-md-color-primary="orange"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="deep-orange"] { + background-color: #ff7043; } + +[data-md-color-primary="deep-orange"] .md-typeset a { + color: #ff7043; } + +[data-md-color-primary="deep-orange"] .md-header { + background-color: #ff7043; } + +[data-md-color-primary="deep-orange"] .md-hero { + background-color: #ff7043; } + +[data-md-color-primary="deep-orange"] .md-nav__link:active, +[data-md-color-primary="deep-orange"] .md-nav__link--active { + color: #ff7043; } + +[data-md-color-primary="deep-orange"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="brown"] { + background-color: #795548; } + +[data-md-color-primary="brown"] .md-typeset a { + color: #795548; } + +[data-md-color-primary="brown"] .md-header { + background-color: #795548; } + +[data-md-color-primary="brown"] .md-hero { + background-color: #795548; } + +[data-md-color-primary="brown"] .md-nav__link:active, +[data-md-color-primary="brown"] .md-nav__link--active { + color: #795548; } + +[data-md-color-primary="brown"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="grey"] { + background-color: #757575; } + +[data-md-color-primary="grey"] .md-typeset a { + color: #757575; } + +[data-md-color-primary="grey"] .md-header { + background-color: #757575; } + +[data-md-color-primary="grey"] .md-hero { + background-color: #757575; } + +[data-md-color-primary="grey"] .md-nav__link:active, +[data-md-color-primary="grey"] .md-nav__link--active { + color: #757575; } + +[data-md-color-primary="grey"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="blue-grey"] { + background-color: #546e7a; } + +[data-md-color-primary="blue-grey"] .md-typeset a { + color: #546e7a; } + +[data-md-color-primary="blue-grey"] .md-header { + background-color: #546e7a; } + +[data-md-color-primary="blue-grey"] .md-hero { + background-color: #546e7a; } + +[data-md-color-primary="blue-grey"] .md-nav__link:active, +[data-md-color-primary="blue-grey"] .md-nav__link--active { + color: #546e7a; } + +[data-md-color-primary="blue-grey"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="white"] { + background-color: white; + color: rgba(0, 0, 0, 0.87); + box-shadow: 0 0 0.1rem rgba(0, 0, 0, 0.54) inset; } + +[data-md-color-primary="white"] .md-header { + background-color: white; + color: rgba(0, 0, 0, 0.87); } + +[data-md-color-primary="white"] .md-hero { + background-color: white; + color: rgba(0, 0, 0, 0.87); } + [data-md-color-primary="white"] .md-hero--expand { + border-bottom: 0.1rem solid rgba(0, 0, 0, 0.07); } + +button[data-md-color-accent="red"] { + background-color: #ff1744; } + +[data-md-color-accent="red"] .md-typeset a:hover, +[data-md-color-accent="red"] .md-typeset a:active { + color: #ff1744; } + +[data-md-color-accent="red"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="red"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #ff1744; } + +[data-md-color-accent="red"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="red"] .md-typeset .md-clipboard:active::before { + color: #ff1744; } + +[data-md-color-accent="red"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="red"] .md-typeset .footnote li:target .footnote-backref { + color: #ff1744; } + +[data-md-color-accent="red"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="red"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="red"] .md-typeset [id] .headerlink:focus { + color: #ff1744; } + +[data-md-color-accent="red"] .md-nav__link:focus, +[data-md-color-accent="red"] .md-nav__link:hover { + color: #ff1744; } + +[data-md-color-accent="red"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff1744; } + +[data-md-color-accent="red"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="red"] .md-search-result__link:hover { + background-color: rgba(255, 23, 68, 0.1); } + +[data-md-color-accent="red"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff1744; } + +[data-md-color-accent="red"] .md-source-file:hover::before { + background-color: #ff1744; } + +button[data-md-color-accent="pink"] { + background-color: #f50057; } + +[data-md-color-accent="pink"] .md-typeset a:hover, +[data-md-color-accent="pink"] .md-typeset a:active { + color: #f50057; } + +[data-md-color-accent="pink"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="pink"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #f50057; } + +[data-md-color-accent="pink"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="pink"] .md-typeset .md-clipboard:active::before { + color: #f50057; } + +[data-md-color-accent="pink"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="pink"] .md-typeset .footnote li:target .footnote-backref { + color: #f50057; } + +[data-md-color-accent="pink"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="pink"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="pink"] .md-typeset [id] .headerlink:focus { + color: #f50057; } + +[data-md-color-accent="pink"] .md-nav__link:focus, +[data-md-color-accent="pink"] .md-nav__link:hover { + color: #f50057; } + +[data-md-color-accent="pink"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #f50057; } + +[data-md-color-accent="pink"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="pink"] .md-search-result__link:hover { + background-color: rgba(245, 0, 87, 0.1); } + +[data-md-color-accent="pink"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #f50057; } + +[data-md-color-accent="pink"] .md-source-file:hover::before { + background-color: #f50057; } + +button[data-md-color-accent="purple"] { + background-color: #e040fb; } + +[data-md-color-accent="purple"] .md-typeset a:hover, +[data-md-color-accent="purple"] .md-typeset a:active { + color: #e040fb; } + +[data-md-color-accent="purple"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="purple"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #e040fb; } + +[data-md-color-accent="purple"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="purple"] .md-typeset .md-clipboard:active::before { + color: #e040fb; } + +[data-md-color-accent="purple"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="purple"] .md-typeset .footnote li:target .footnote-backref { + color: #e040fb; } + +[data-md-color-accent="purple"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="purple"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="purple"] .md-typeset [id] .headerlink:focus { + color: #e040fb; } + +[data-md-color-accent="purple"] .md-nav__link:focus, +[data-md-color-accent="purple"] .md-nav__link:hover { + color: #e040fb; } + +[data-md-color-accent="purple"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #e040fb; } + +[data-md-color-accent="purple"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="purple"] .md-search-result__link:hover { + background-color: rgba(224, 64, 251, 0.1); } + +[data-md-color-accent="purple"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #e040fb; } + +[data-md-color-accent="purple"] .md-source-file:hover::before { + background-color: #e040fb; } + +button[data-md-color-accent="deep-purple"] { + background-color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-typeset a:hover, +[data-md-color-accent="deep-purple"] .md-typeset a:active { + color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="deep-purple"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="deep-purple"] .md-typeset .md-clipboard:active::before { + color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="deep-purple"] .md-typeset .footnote li:target .footnote-backref { + color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="deep-purple"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="deep-purple"] .md-typeset [id] .headerlink:focus { + color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-nav__link:focus, +[data-md-color-accent="deep-purple"] .md-nav__link:hover { + color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="deep-purple"] .md-search-result__link:hover { + background-color: rgba(124, 77, 255, 0.1); } + +[data-md-color-accent="deep-purple"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-source-file:hover::before { + background-color: #7c4dff; } + +button[data-md-color-accent="indigo"] { + background-color: #536dfe; } + +[data-md-color-accent="indigo"] .md-typeset a:hover, +[data-md-color-accent="indigo"] .md-typeset a:active { + color: #536dfe; } + +[data-md-color-accent="indigo"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="indigo"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + +[data-md-color-accent="indigo"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="indigo"] .md-typeset .md-clipboard:active::before { + color: #536dfe; } + +[data-md-color-accent="indigo"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="indigo"] .md-typeset .footnote li:target .footnote-backref { + color: #536dfe; } + +[data-md-color-accent="indigo"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="indigo"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="indigo"] .md-typeset [id] .headerlink:focus { + color: #536dfe; } + +[data-md-color-accent="indigo"] .md-nav__link:focus, +[data-md-color-accent="indigo"] .md-nav__link:hover { + color: #536dfe; } + +[data-md-color-accent="indigo"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + +[data-md-color-accent="indigo"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="indigo"] .md-search-result__link:hover { + background-color: rgba(83, 109, 254, 0.1); } + +[data-md-color-accent="indigo"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + +[data-md-color-accent="indigo"] .md-source-file:hover::before { + background-color: #536dfe; } + +button[data-md-color-accent="blue"] { + background-color: #448aff; } + +[data-md-color-accent="blue"] .md-typeset a:hover, +[data-md-color-accent="blue"] .md-typeset a:active { + color: #448aff; } + +[data-md-color-accent="blue"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="blue"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #448aff; } + +[data-md-color-accent="blue"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="blue"] .md-typeset .md-clipboard:active::before { + color: #448aff; } + +[data-md-color-accent="blue"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="blue"] .md-typeset .footnote li:target .footnote-backref { + color: #448aff; } + +[data-md-color-accent="blue"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="blue"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="blue"] .md-typeset [id] .headerlink:focus { + color: #448aff; } + +[data-md-color-accent="blue"] .md-nav__link:focus, +[data-md-color-accent="blue"] .md-nav__link:hover { + color: #448aff; } + +[data-md-color-accent="blue"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #448aff; } + +[data-md-color-accent="blue"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="blue"] .md-search-result__link:hover { + background-color: rgba(68, 138, 255, 0.1); } + +[data-md-color-accent="blue"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #448aff; } + +[data-md-color-accent="blue"] .md-source-file:hover::before { + background-color: #448aff; } + +button[data-md-color-accent="light-blue"] { + background-color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-typeset a:hover, +[data-md-color-accent="light-blue"] .md-typeset a:active { + color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="light-blue"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="light-blue"] .md-typeset .md-clipboard:active::before { + color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="light-blue"] .md-typeset .footnote li:target .footnote-backref { + color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="light-blue"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="light-blue"] .md-typeset [id] .headerlink:focus { + color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-nav__link:focus, +[data-md-color-accent="light-blue"] .md-nav__link:hover { + color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="light-blue"] .md-search-result__link:hover { + background-color: rgba(0, 145, 234, 0.1); } + +[data-md-color-accent="light-blue"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-source-file:hover::before { + background-color: #0091ea; } + +button[data-md-color-accent="cyan"] { + background-color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-typeset a:hover, +[data-md-color-accent="cyan"] .md-typeset a:active { + color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="cyan"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="cyan"] .md-typeset .md-clipboard:active::before { + color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="cyan"] .md-typeset .footnote li:target .footnote-backref { + color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="cyan"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="cyan"] .md-typeset [id] .headerlink:focus { + color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-nav__link:focus, +[data-md-color-accent="cyan"] .md-nav__link:hover { + color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="cyan"] .md-search-result__link:hover { + background-color: rgba(0, 184, 212, 0.1); } + +[data-md-color-accent="cyan"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-source-file:hover::before { + background-color: #00b8d4; } + +button[data-md-color-accent="teal"] { + background-color: #00bfa5; } + +[data-md-color-accent="teal"] .md-typeset a:hover, +[data-md-color-accent="teal"] .md-typeset a:active { + color: #00bfa5; } + +[data-md-color-accent="teal"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="teal"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5; } + +[data-md-color-accent="teal"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="teal"] .md-typeset .md-clipboard:active::before { + color: #00bfa5; } + +[data-md-color-accent="teal"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="teal"] .md-typeset .footnote li:target .footnote-backref { + color: #00bfa5; } + +[data-md-color-accent="teal"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="teal"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="teal"] .md-typeset [id] .headerlink:focus { + color: #00bfa5; } + +[data-md-color-accent="teal"] .md-nav__link:focus, +[data-md-color-accent="teal"] .md-nav__link:hover { + color: #00bfa5; } + +[data-md-color-accent="teal"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5; } + +[data-md-color-accent="teal"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="teal"] .md-search-result__link:hover { + background-color: rgba(0, 191, 165, 0.1); } + +[data-md-color-accent="teal"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5; } + +[data-md-color-accent="teal"] .md-source-file:hover::before { + background-color: #00bfa5; } + +button[data-md-color-accent="green"] { + background-color: #00c853; } + +[data-md-color-accent="green"] .md-typeset a:hover, +[data-md-color-accent="green"] .md-typeset a:active { + color: #00c853; } + +[data-md-color-accent="green"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="green"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #00c853; } + +[data-md-color-accent="green"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="green"] .md-typeset .md-clipboard:active::before { + color: #00c853; } + +[data-md-color-accent="green"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="green"] .md-typeset .footnote li:target .footnote-backref { + color: #00c853; } + +[data-md-color-accent="green"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="green"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="green"] .md-typeset [id] .headerlink:focus { + color: #00c853; } + +[data-md-color-accent="green"] .md-nav__link:focus, +[data-md-color-accent="green"] .md-nav__link:hover { + color: #00c853; } + +[data-md-color-accent="green"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00c853; } + +[data-md-color-accent="green"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="green"] .md-search-result__link:hover { + background-color: rgba(0, 200, 83, 0.1); } + +[data-md-color-accent="green"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00c853; } + +[data-md-color-accent="green"] .md-source-file:hover::before { + background-color: #00c853; } + +button[data-md-color-accent="light-green"] { + background-color: #64dd17; } + +[data-md-color-accent="light-green"] .md-typeset a:hover, +[data-md-color-accent="light-green"] .md-typeset a:active { + color: #64dd17; } + +[data-md-color-accent="light-green"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="light-green"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #64dd17; } + +[data-md-color-accent="light-green"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="light-green"] .md-typeset .md-clipboard:active::before { + color: #64dd17; } + +[data-md-color-accent="light-green"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="light-green"] .md-typeset .footnote li:target .footnote-backref { + color: #64dd17; } + +[data-md-color-accent="light-green"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="light-green"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="light-green"] .md-typeset [id] .headerlink:focus { + color: #64dd17; } + +[data-md-color-accent="light-green"] .md-nav__link:focus, +[data-md-color-accent="light-green"] .md-nav__link:hover { + color: #64dd17; } + +[data-md-color-accent="light-green"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #64dd17; } + +[data-md-color-accent="light-green"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="light-green"] .md-search-result__link:hover { + background-color: rgba(100, 221, 23, 0.1); } + +[data-md-color-accent="light-green"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #64dd17; } + +[data-md-color-accent="light-green"] .md-source-file:hover::before { + background-color: #64dd17; } + +button[data-md-color-accent="lime"] { + background-color: #aeea00; } + +[data-md-color-accent="lime"] .md-typeset a:hover, +[data-md-color-accent="lime"] .md-typeset a:active { + color: #aeea00; } + +[data-md-color-accent="lime"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="lime"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #aeea00; } + +[data-md-color-accent="lime"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="lime"] .md-typeset .md-clipboard:active::before { + color: #aeea00; } + +[data-md-color-accent="lime"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="lime"] .md-typeset .footnote li:target .footnote-backref { + color: #aeea00; } + +[data-md-color-accent="lime"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="lime"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="lime"] .md-typeset [id] .headerlink:focus { + color: #aeea00; } + +[data-md-color-accent="lime"] .md-nav__link:focus, +[data-md-color-accent="lime"] .md-nav__link:hover { + color: #aeea00; } + +[data-md-color-accent="lime"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #aeea00; } + +[data-md-color-accent="lime"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="lime"] .md-search-result__link:hover { + background-color: rgba(174, 234, 0, 0.1); } + +[data-md-color-accent="lime"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #aeea00; } + +[data-md-color-accent="lime"] .md-source-file:hover::before { + background-color: #aeea00; } + +button[data-md-color-accent="yellow"] { + background-color: #ffd600; } + +[data-md-color-accent="yellow"] .md-typeset a:hover, +[data-md-color-accent="yellow"] .md-typeset a:active { + color: #ffd600; } + +[data-md-color-accent="yellow"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="yellow"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #ffd600; } + +[data-md-color-accent="yellow"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="yellow"] .md-typeset .md-clipboard:active::before { + color: #ffd600; } + +[data-md-color-accent="yellow"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="yellow"] .md-typeset .footnote li:target .footnote-backref { + color: #ffd600; } + +[data-md-color-accent="yellow"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="yellow"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="yellow"] .md-typeset [id] .headerlink:focus { + color: #ffd600; } + +[data-md-color-accent="yellow"] .md-nav__link:focus, +[data-md-color-accent="yellow"] .md-nav__link:hover { + color: #ffd600; } + +[data-md-color-accent="yellow"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffd600; } + +[data-md-color-accent="yellow"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="yellow"] .md-search-result__link:hover { + background-color: rgba(255, 214, 0, 0.1); } + +[data-md-color-accent="yellow"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffd600; } + +[data-md-color-accent="yellow"] .md-source-file:hover::before { + background-color: #ffd600; } + +button[data-md-color-accent="amber"] { + background-color: #ffab00; } + +[data-md-color-accent="amber"] .md-typeset a:hover, +[data-md-color-accent="amber"] .md-typeset a:active { + color: #ffab00; } + +[data-md-color-accent="amber"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="amber"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #ffab00; } + +[data-md-color-accent="amber"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="amber"] .md-typeset .md-clipboard:active::before { + color: #ffab00; } + +[data-md-color-accent="amber"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="amber"] .md-typeset .footnote li:target .footnote-backref { + color: #ffab00; } + +[data-md-color-accent="amber"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="amber"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="amber"] .md-typeset [id] .headerlink:focus { + color: #ffab00; } + +[data-md-color-accent="amber"] .md-nav__link:focus, +[data-md-color-accent="amber"] .md-nav__link:hover { + color: #ffab00; } + +[data-md-color-accent="amber"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffab00; } + +[data-md-color-accent="amber"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="amber"] .md-search-result__link:hover { + background-color: rgba(255, 171, 0, 0.1); } + +[data-md-color-accent="amber"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffab00; } + +[data-md-color-accent="amber"] .md-source-file:hover::before { + background-color: #ffab00; } + +button[data-md-color-accent="orange"] { + background-color: #ff9100; } + +[data-md-color-accent="orange"] .md-typeset a:hover, +[data-md-color-accent="orange"] .md-typeset a:active { + color: #ff9100; } + +[data-md-color-accent="orange"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="orange"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #ff9100; } + +[data-md-color-accent="orange"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="orange"] .md-typeset .md-clipboard:active::before { + color: #ff9100; } + +[data-md-color-accent="orange"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="orange"] .md-typeset .footnote li:target .footnote-backref { + color: #ff9100; } + +[data-md-color-accent="orange"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="orange"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="orange"] .md-typeset [id] .headerlink:focus { + color: #ff9100; } + +[data-md-color-accent="orange"] .md-nav__link:focus, +[data-md-color-accent="orange"] .md-nav__link:hover { + color: #ff9100; } + +[data-md-color-accent="orange"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff9100; } + +[data-md-color-accent="orange"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="orange"] .md-search-result__link:hover { + background-color: rgba(255, 145, 0, 0.1); } + +[data-md-color-accent="orange"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff9100; } + +[data-md-color-accent="orange"] .md-source-file:hover::before { + background-color: #ff9100; } + +button[data-md-color-accent="deep-orange"] { + background-color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-typeset a:hover, +[data-md-color-accent="deep-orange"] .md-typeset a:active { + color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="deep-orange"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="deep-orange"] .md-typeset .md-clipboard:active::before { + color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="deep-orange"] .md-typeset .footnote li:target .footnote-backref { + color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="deep-orange"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="deep-orange"] .md-typeset [id] .headerlink:focus { + color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-nav__link:focus, +[data-md-color-accent="deep-orange"] .md-nav__link:hover { + color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="deep-orange"] .md-search-result__link:hover { + background-color: rgba(255, 110, 64, 0.1); } + +[data-md-color-accent="deep-orange"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-source-file:hover::before { + background-color: #ff6e40; } + +@media only screen and (max-width: 59.9375em) { + [data-md-color-primary="red"] .md-nav__source { + background-color: rgba(190, 66, 64, 0.9675); } + [data-md-color-primary="pink"] .md-nav__source { + background-color: rgba(185, 24, 79, 0.9675); } + [data-md-color-primary="purple"] .md-nav__source { + background-color: rgba(136, 57, 150, 0.9675); } + [data-md-color-primary="deep-purple"] .md-nav__source { + background-color: rgba(100, 69, 154, 0.9675); } + [data-md-color-primary="indigo"] .md-nav__source { + background-color: rgba(50, 64, 144, 0.9675); } + [data-md-color-primary="blue"] .md-nav__source { + background-color: rgba(26, 119, 193, 0.9675); } + [data-md-color-primary="light-blue"] .md-nav__source { + background-color: rgba(2, 134, 194, 0.9675); } + [data-md-color-primary="cyan"] .md-nav__source { + background-color: rgba(0, 150, 169, 0.9675); } + [data-md-color-primary="teal"] .md-nav__source { + background-color: rgba(0, 119, 108, 0.9675); } + [data-md-color-primary="green"] .md-nav__source { + background-color: rgba(60, 139, 64, 0.9675); } + [data-md-color-primary="light-green"] .md-nav__source { + background-color: rgba(99, 142, 53, 0.9675); } + [data-md-color-primary="lime"] .md-nav__source { + background-color: rgba(153, 161, 41, 0.9675); } + [data-md-color-primary="yellow"] .md-nav__source { + background-color: rgba(198, 134, 29, 0.9675); } + [data-md-color-primary="amber"] .md-nav__source { + background-color: rgba(203, 127, 0, 0.9675); } + [data-md-color-primary="orange"] .md-nav__source { + background-color: rgba(200, 111, 0, 0.9675); } + [data-md-color-primary="deep-orange"] .md-nav__source { + background-color: rgba(203, 89, 53, 0.9675); } + [data-md-color-primary="brown"] .md-nav__source { + background-color: rgba(96, 68, 57, 0.9675); } + [data-md-color-primary="grey"] .md-nav__source { + background-color: rgba(93, 93, 93, 0.9675); } + [data-md-color-primary="blue-grey"] .md-nav__source { + background-color: rgba(67, 88, 97, 0.9675); } + [data-md-color-primary="white"] .md-nav__source { + background-color: rgba(0, 0, 0, 0.07); + color: rgba(0, 0, 0, 0.87); } } + +@media only screen and (max-width: 76.1875em) { + html [data-md-color-primary="red"] .md-nav--primary .md-nav__title--site { + background-color: #ef5350; } + html [data-md-color-primary="pink"] .md-nav--primary .md-nav__title--site { + background-color: #e91e63; } + html [data-md-color-primary="purple"] .md-nav--primary .md-nav__title--site { + background-color: #ab47bc; } + html [data-md-color-primary="deep-purple"] .md-nav--primary .md-nav__title--site { + background-color: #7e57c2; } + html [data-md-color-primary="indigo"] .md-nav--primary .md-nav__title--site { + background-color: #3f51b5; } + html [data-md-color-primary="blue"] .md-nav--primary .md-nav__title--site { + background-color: #2196f3; } + html [data-md-color-primary="light-blue"] .md-nav--primary .md-nav__title--site { + background-color: #03a9f4; } + html [data-md-color-primary="cyan"] .md-nav--primary .md-nav__title--site { + background-color: #00bcd4; } + html [data-md-color-primary="teal"] .md-nav--primary .md-nav__title--site { + background-color: #009688; } + html [data-md-color-primary="green"] .md-nav--primary .md-nav__title--site { + background-color: #4caf50; } + html [data-md-color-primary="light-green"] .md-nav--primary .md-nav__title--site { + background-color: #7cb342; } + html [data-md-color-primary="lime"] .md-nav--primary .md-nav__title--site { + background-color: #c0ca33; } + html [data-md-color-primary="yellow"] .md-nav--primary .md-nav__title--site { + background-color: #f9a825; } + html [data-md-color-primary="amber"] .md-nav--primary .md-nav__title--site { + background-color: #ffa000; } + html [data-md-color-primary="orange"] .md-nav--primary .md-nav__title--site { + background-color: #fb8c00; } + html [data-md-color-primary="deep-orange"] .md-nav--primary .md-nav__title--site { + background-color: #ff7043; } + html [data-md-color-primary="brown"] .md-nav--primary .md-nav__title--site { + background-color: #795548; } + html [data-md-color-primary="grey"] .md-nav--primary .md-nav__title--site { + background-color: #757575; } + html [data-md-color-primary="blue-grey"] .md-nav--primary .md-nav__title--site { + background-color: #546e7a; } + html [data-md-color-primary="white"] .md-nav--primary .md-nav__title--site { + background-color: white; + color: rgba(0, 0, 0, 0.87); } + [data-md-color-primary="white"] .md-hero { + border-bottom: 0.1rem solid rgba(0, 0, 0, 0.07); } } + +@media only screen and (min-width: 76.25em) { + [data-md-color-primary="red"] .md-tabs { + background-color: #ef5350; } + [data-md-color-primary="pink"] .md-tabs { + background-color: #e91e63; } + [data-md-color-primary="purple"] .md-tabs { + background-color: #ab47bc; } + [data-md-color-primary="deep-purple"] .md-tabs { + background-color: #7e57c2; } + [data-md-color-primary="indigo"] .md-tabs { + background-color: #3f51b5; } + [data-md-color-primary="blue"] .md-tabs { + background-color: #2196f3; } + [data-md-color-primary="light-blue"] .md-tabs { + background-color: #03a9f4; } + [data-md-color-primary="cyan"] .md-tabs { + background-color: #00bcd4; } + [data-md-color-primary="teal"] .md-tabs { + background-color: #009688; } + [data-md-color-primary="green"] .md-tabs { + background-color: #4caf50; } + [data-md-color-primary="light-green"] .md-tabs { + background-color: #7cb342; } + [data-md-color-primary="lime"] .md-tabs { + background-color: #c0ca33; } + [data-md-color-primary="yellow"] .md-tabs { + background-color: #f9a825; } + [data-md-color-primary="amber"] .md-tabs { + background-color: #ffa000; } + [data-md-color-primary="orange"] .md-tabs { + background-color: #fb8c00; } + [data-md-color-primary="deep-orange"] .md-tabs { + background-color: #ff7043; } + [data-md-color-primary="brown"] .md-tabs { + background-color: #795548; } + [data-md-color-primary="grey"] .md-tabs { + background-color: #757575; } + [data-md-color-primary="blue-grey"] .md-tabs { + background-color: #546e7a; } + [data-md-color-primary="white"] .md-tabs { + border-bottom: 0.1rem solid rgba(0, 0, 0, 0.07); + background-color: white; + color: rgba(0, 0, 0, 0.87); } } + +@media only screen and (min-width: 60em) { + [data-md-color-primary="white"] .md-search__input { + background-color: rgba(0, 0, 0, 0.07); } + [data-md-color-primary="white"] .md-search__input::-webkit-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-color-primary="white"] .md-search__input:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-color-primary="white"] .md-search__input::-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-color-primary="white"] .md-search__input::placeholder { + color: rgba(0, 0, 0, 0.54); } } + +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJhc3NldHMvc3R5bGVzaGVldHMvYXBwbGljYXRpb24tcGFsZXR0ZS4yMjkxNTEyNi5jc3MiLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file diff --git a/assets/stylesheets/application.451f80e5.css b/assets/stylesheets/application.451f80e5.css new file mode 100644 index 0000000000..7001a0c845 --- /dev/null +++ b/assets/stylesheets/application.451f80e5.css @@ -0,0 +1,2557 @@ +/*! + Material for MkDocs + Copyright (c) 2016-2018 Martin Donath + License: MIT +*/ +@charset "UTF-8"; +html { + box-sizing: border-box; } + +*, +*::before, +*::after { + box-sizing: inherit; } + +html { + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; + -ms-text-size-adjust: none; + text-size-adjust: none; } + +body { + margin: 0; } + +hr { + overflow: visible; + box-sizing: content-box; } + +a { + -webkit-text-decoration-skip: objects; } + +a, +button, +label, +input { + -webkit-tap-highlight-color: transparent; } + +a { + color: inherit; + text-decoration: none; } + +small { + font-size: 80%; } + +sub, +sup { + position: relative; + font-size: 80%; + line-height: 0; + vertical-align: baseline; } + +sub { + bottom: -0.25em; } + +sup { + top: -0.5em; } + +img { + border-style: none; } + +table { + border-collapse: separate; + border-spacing: 0; } + +td, +th { + font-weight: normal; + vertical-align: top; } + +button { + margin: 0; + padding: 0; + border: 0; + outline-style: none; + background: transparent; + font-size: inherit; } + +input { + border: 0; + outline: 0; } + +.md-icon, .md-clipboard::before, .md-nav__title::before, .md-nav__button, .md-nav__link::after, .md-search-result__article--document::before, .md-source-file::before, .md-typeset .admonition > .admonition-title::before, .md-typeset details > .admonition-title::before, .md-typeset .admonition > summary::before, .md-typeset details > summary::before, .md-typeset .footnote-backref, .md-typeset .critic.comment::before, .md-typeset summary::after, .md-typeset .task-list-control .task-list-indicator::before { + font-family: "Material Icons"; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: 1; + text-transform: none; + white-space: nowrap; + speak: none; + word-wrap: normal; + direction: ltr; } + .md-content__icon, .md-header-nav__button, .md-footer-nav__button, .md-nav__title::before, .md-nav__button, .md-search-result__article--document::before { + display: inline-block; + margin: 0.4rem; + padding: 0.8rem; + font-size: 2.4rem; + cursor: pointer; } + +.md-icon--arrow-back::before { + content: "\E5C4"; } + +.md-icon--arrow-forward::before { + content: "\E5C8"; } + +.md-icon--menu::before { + content: "\E5D2"; } + +.md-icon--search::before { + content: "\E8B6"; } + +[dir="rtl"] .md-icon--arrow-back::before { + content: "\E5C8"; } + +[dir="rtl"] .md-icon--arrow-forward::before { + content: "\E5C4"; } + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +body, +input { + color: rgba(0, 0, 0, 0.87); + -webkit-font-feature-settings: "kern", "liga"; + font-feature-settings: "kern", "liga"; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } + +pre, +code, +kbd { + color: rgba(0, 0, 0, 0.87); + -webkit-font-feature-settings: "kern"; + font-feature-settings: "kern"; + font-family: "Courier New", Courier, monospace; } + +.md-typeset { + font-size: 1.6rem; + line-height: 1.6; + -webkit-print-color-adjust: exact; } + .md-typeset p, + .md-typeset ul, + .md-typeset ol, + .md-typeset blockquote { + margin: 1em 0; } + .md-typeset h1 { + margin: 0 0 4rem; + color: rgba(0, 0, 0, 0.54); + font-size: 3.125rem; + font-weight: 300; + letter-spacing: -0.01em; + line-height: 1.3; } + .md-typeset h2 { + margin: 4rem 0 1.6rem; + font-size: 2.5rem; + font-weight: 300; + letter-spacing: -0.01em; + line-height: 1.4; } + .md-typeset h3 { + margin: 3.2rem 0 1.6rem; + font-size: 2rem; + font-weight: 400; + letter-spacing: -0.01em; + line-height: 1.5; } + .md-typeset h2 + h3 { + margin-top: 1.6rem; } + .md-typeset h4 { + margin: 1.6rem 0; + font-size: 1.6rem; + font-weight: 700; + letter-spacing: -0.01em; } + .md-typeset h5, + .md-typeset h6 { + margin: 1.6rem 0; + color: rgba(0, 0, 0, 0.54); + font-size: 1.28rem; + font-weight: 700; + letter-spacing: -0.01em; } + .md-typeset h5 { + text-transform: uppercase; } + .md-typeset hr { + margin: 1.5em 0; + border-bottom: 0.1rem dotted rgba(0, 0, 0, 0.26); } + .md-typeset a { + color: #3f51b5; + word-break: break-word; } + .md-typeset a, .md-typeset a::before { + transition: color 0.125s; } + .md-typeset a:hover, .md-typeset a:active { + color: #536dfe; } + .md-typeset code, + .md-typeset pre { + background-color: rgba(236, 236, 236, 0.5); + color: #37474F; + font-size: 85%; + direction: ltr; } + .md-typeset code { + margin: 0 0.29412em; + padding: 0.07353em 0; + border-radius: 0.2rem; + box-shadow: 0.29412em 0 0 rgba(236, 236, 236, 0.5), -0.29412em 0 0 rgba(236, 236, 236, 0.5); + word-break: break-word; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; } + .md-typeset h1 code, + .md-typeset h2 code, + .md-typeset h3 code, + .md-typeset h4 code, + .md-typeset h5 code, + .md-typeset h6 code { + margin: 0; + background-color: transparent; + box-shadow: none; } + .md-typeset a > code { + margin: inherit; + padding: inherit; + border-radius: none; + background-color: inherit; + color: inherit; + box-shadow: none; } + .md-typeset pre { + position: relative; + margin: 1em 0; + border-radius: 0.2rem; + line-height: 1.4; + -webkit-overflow-scrolling: touch; } + .md-typeset pre > code { + display: block; + margin: 0; + padding: 1.05rem 1.2rem; + background-color: transparent; + font-size: inherit; + box-shadow: none; + -webkit-box-decoration-break: none; + box-decoration-break: none; + overflow: auto; } + .md-typeset pre > code::-webkit-scrollbar { + width: 0.4rem; + height: 0.4rem; } + .md-typeset pre > code::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.26); } + .md-typeset pre > code::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + .md-typeset kbd { + padding: 0 0.29412em; + border: 0.1rem solid #c9c9c9; + border-radius: 0.3rem; + border-bottom-color: #bcbcbc; + background-color: #FCFCFC; + color: #555555; + font-size: 85%; + box-shadow: 0 0.1rem 0 #b0b0b0; + word-break: break-word; } + .md-typeset mark { + margin: 0 0.25em; + padding: 0.0625em 0; + border-radius: 0.2rem; + background-color: rgba(255, 235, 59, 0.5); + box-shadow: 0.25em 0 0 rgba(255, 235, 59, 0.5), -0.25em 0 0 rgba(255, 235, 59, 0.5); + word-break: break-word; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; } + .md-typeset abbr { + border-bottom: 0.1rem dotted rgba(0, 0, 0, 0.54); + text-decoration: none; + cursor: help; } + .md-typeset small { + opacity: 0.75; } + .md-typeset sup, + .md-typeset sub { + margin-left: 0.07812em; } + [dir="rtl"] .md-typeset sup, [dir="rtl"] + .md-typeset sub { + margin-right: 0.07812em; + margin-left: initial; } + .md-typeset blockquote { + padding-left: 1.2rem; + border-left: 0.4rem solid rgba(0, 0, 0, 0.26); + color: rgba(0, 0, 0, 0.54); } + [dir="rtl"] .md-typeset blockquote { + padding-right: 1.2rem; + padding-left: initial; + border-right: 0.4rem solid rgba(0, 0, 0, 0.26); + border-left: initial; } + .md-typeset ul { + list-style-type: disc; } + .md-typeset ul, + .md-typeset ol { + margin-left: 0.625em; + padding: 0; } + [dir="rtl"] .md-typeset ul, [dir="rtl"] + .md-typeset ol { + margin-right: 0.625em; + margin-left: initial; } + .md-typeset ul ol, + .md-typeset ol ol { + list-style-type: lower-alpha; } + .md-typeset ul ol ol, + .md-typeset ol ol ol { + list-style-type: lower-roman; } + .md-typeset ul li, + .md-typeset ol li { + margin-bottom: 0.5em; + margin-left: 1.25em; } + [dir="rtl"] .md-typeset ul li, [dir="rtl"] + .md-typeset ol li { + margin-right: 1.25em; + margin-left: initial; } + .md-typeset ul li p, + .md-typeset ul li blockquote, + .md-typeset ol li p, + .md-typeset ol li blockquote { + margin: 0.5em 0; } + .md-typeset ul li:last-child, + .md-typeset ol li:last-child { + margin-bottom: 0; } + .md-typeset ul li ul, + .md-typeset ul li ol, + .md-typeset ol li ul, + .md-typeset ol li ol { + margin: 0.5em 0 0.5em 0.625em; } + [dir="rtl"] .md-typeset ul li ul, [dir="rtl"] + .md-typeset ul li ol, [dir="rtl"] + .md-typeset ol li ul, [dir="rtl"] + .md-typeset ol li ol { + margin-right: 0.625em; + margin-left: initial; } + .md-typeset dd { + margin: 1em 0 1em 1.875em; } + [dir="rtl"] .md-typeset dd { + margin-right: 1.875em; + margin-left: initial; } + .md-typeset iframe, + .md-typeset img, + .md-typeset svg { + max-width: 100%; } + .md-typeset table:not([class]) { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); + display: inline-block; + max-width: 100%; + border-radius: 0.2rem; + font-size: 1.28rem; + overflow: auto; + -webkit-overflow-scrolling: touch; } + .md-typeset table:not([class]) + * { + margin-top: 1.5em; } + .md-typeset table:not([class]) th:not([align]), + .md-typeset table:not([class]) td:not([align]) { + text-align: left; } + [dir="rtl"] .md-typeset table:not([class]) th:not([align]), [dir="rtl"] + .md-typeset table:not([class]) td:not([align]) { + text-align: right; } + .md-typeset table:not([class]) th { + min-width: 10rem; + padding: 1.2rem 1.6rem; + background-color: rgba(0, 0, 0, 0.54); + color: white; + vertical-align: top; } + .md-typeset table:not([class]) td { + padding: 1.2rem 1.6rem; + border-top: 0.1rem solid rgba(0, 0, 0, 0.07); + vertical-align: top; } + .md-typeset table:not([class]) tr:first-child td { + border-top: 0; } + .md-typeset table:not([class]) a { + word-break: normal; } + .md-typeset__scrollwrap { + margin: 1em -1.6rem; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .md-typeset .md-typeset__table { + display: inline-block; + margin-bottom: 0.5em; + padding: 0 1.6rem; } + .md-typeset .md-typeset__table table { + display: table; + width: 100%; + margin: 0; + overflow: hidden; } + +html { + height: 100%; + font-size: 62.5%; + overflow-x: hidden; } + +body { + position: relative; + height: 100%; } + +hr { + display: block; + height: 0.1rem; + padding: 0; + border: 0; } + +.md-svg { + display: none; } + +.md-grid { + max-width: 122rem; + margin-right: auto; + margin-left: auto; } + +.md-container, +.md-main { + overflow: auto; } + +.md-container { + display: table; + width: 100%; + height: 100%; + padding-top: 4.8rem; + table-layout: fixed; } + +.md-main { + display: table-row; + height: 100%; } + .md-main__inner { + height: 100%; + padding-top: 3rem; + padding-bottom: 0.1rem; } + +.md-toggle { + display: none; } + +.md-overlay { + position: fixed; + top: 0; + width: 0; + height: 0; + transition: width 0s 0.25s, height 0s 0.25s, opacity 0.25s; + background-color: rgba(0, 0, 0, 0.54); + opacity: 0; + z-index: 3; } + +.md-flex { + display: table; } + .md-flex__cell { + display: table-cell; + position: relative; + vertical-align: top; } + .md-flex__cell--shrink { + width: 0%; } + .md-flex__cell--stretch { + display: table; + width: 100%; + table-layout: fixed; } + .md-flex__ellipsis { + display: table-cell; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + +.md-skip { + position: fixed; + width: 0.1rem; + height: 0.1rem; + margin: 1rem; + padding: 0.6rem 1rem; + clip: rect(0.1rem); + -webkit-transform: translateY(0.8rem); + transform: translateY(0.8rem); + border-radius: 0.2rem; + background-color: rgba(0, 0, 0, 0.87); + color: white; + font-size: 1.28rem; + opacity: 0; + overflow: hidden; } + .md-skip:focus { + width: auto; + height: auto; + clip: auto; + -webkit-transform: translateX(0); + transform: translateX(0); + transition: opacity 0.175s 0.075s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.175s 0.075s; + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.175s 0.075s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + opacity: 1; + z-index: 10; } + +@page { + margin: 25mm; } + +.md-clipboard { + position: absolute; + top: 0.6rem; + right: 0.6rem; + width: 2.8rem; + height: 2.8rem; + border-radius: 0.2rem; + font-size: 1.6rem; + cursor: pointer; + z-index: 1; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + .md-clipboard::before { + transition: color 0.25s, opacity 0.25s; + color: rgba(0, 0, 0, 0.07); + content: "\E14D"; } + pre:hover .md-clipboard::before, + .codehilite:hover .md-clipboard::before, .md-typeset .highlight:hover .md-clipboard::before { + color: rgba(0, 0, 0, 0.54); } + .md-clipboard:focus::before, .md-clipboard:hover::before { + color: #536dfe; } + .md-clipboard__message { + display: block; + position: absolute; + top: 0; + right: 3.4rem; + padding: 0.6rem 1rem; + -webkit-transform: translateX(0.8rem); + transform: translateX(0.8rem); + transition: opacity 0.175s, -webkit-transform 0.25s cubic-bezier(0.9, 0.1, 0.9, 0); + transition: transform 0.25s cubic-bezier(0.9, 0.1, 0.9, 0), opacity 0.175s; + transition: transform 0.25s cubic-bezier(0.9, 0.1, 0.9, 0), opacity 0.175s, -webkit-transform 0.25s cubic-bezier(0.9, 0.1, 0.9, 0); + border-radius: 0.2rem; + background-color: rgba(0, 0, 0, 0.54); + color: white; + font-size: 1.28rem; + white-space: nowrap; + opacity: 0; + pointer-events: none; } + .md-clipboard__message--active { + -webkit-transform: translateX(0); + transform: translateX(0); + transition: opacity 0.175s 0.075s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.175s 0.075s; + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.175s 0.075s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + opacity: 1; + pointer-events: initial; } + .md-clipboard__message::before { + content: attr(aria-label); } + .md-clipboard__message::after { + display: block; + position: absolute; + top: 50%; + right: -0.4rem; + width: 0; + margin-top: -0.4rem; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-style: solid; + border-color: transparent rgba(0, 0, 0, 0.54); + content: ""; } + +.md-content__inner { + margin: 0 1.6rem 2.4rem; + padding-top: 1.2rem; } + .md-content__inner::before { + display: block; + height: 0.8rem; + content: ""; } + .md-content__inner > :last-child { + margin-bottom: 0; } + +.md-content__icon { + position: relative; + margin: 0.8rem 0; + padding: 0; + float: right; } + .md-typeset .md-content__icon { + color: rgba(0, 0, 0, 0.26); } + +.md-header { + position: fixed; + top: 0; + right: 0; + left: 0; + height: 4.8rem; + transition: background-color 0.25s, color 0.25s; + background-color: #3f51b5; + color: white; + box-shadow: none; + z-index: 2; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + .no-js .md-header { + transition: none; + box-shadow: none; } + .md-header[data-md-state="shadow"] { + transition: background-color 0.25s, color 0.25s, box-shadow 0.25s; + box-shadow: 0 0 0.4rem rgba(0, 0, 0, 0.1), 0 0.4rem 0.8rem rgba(0, 0, 0, 0.2); } + +.md-header-nav { + padding: 0 0.4rem; } + .md-header-nav__button { + position: relative; + transition: opacity 0.25s; + z-index: 1; } + .md-header-nav__button:hover { + opacity: 0.7; } + .md-header-nav__button.md-logo * { + display: block; } + .no-js .md-header-nav__button.md-icon--search { + display: none; } + .md-header-nav__topic { + display: block; + position: absolute; + transition: opacity 0.15s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s; + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + .md-header-nav__topic + .md-header-nav__topic { + -webkit-transform: translateX(2.5rem); + transform: translateX(2.5rem); + transition: opacity 0.15s, -webkit-transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1); + transition: transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1), opacity 0.15s; + transition: transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1), opacity 0.15s, -webkit-transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1); + opacity: 0; + z-index: -1; + pointer-events: none; } + [dir="rtl"] .md-header-nav__topic + .md-header-nav__topic { + -webkit-transform: translateX(-2.5rem); + transform: translateX(-2.5rem); } + .no-js .md-header-nav__topic { + position: initial; } + .no-js .md-header-nav__topic + .md-header-nav__topic { + display: none; } + .md-header-nav__title { + padding: 0 2rem; + font-size: 1.8rem; + line-height: 4.8rem; } + .md-header-nav__title[data-md-state="active"] .md-header-nav__topic { + -webkit-transform: translateX(-2.5rem); + transform: translateX(-2.5rem); + transition: opacity 0.15s, -webkit-transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1); + transition: transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1), opacity 0.15s; + transition: transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1), opacity 0.15s, -webkit-transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1); + opacity: 0; + z-index: -1; + pointer-events: none; } + [dir="rtl"] .md-header-nav__title[data-md-state="active"] .md-header-nav__topic { + -webkit-transform: translateX(2.5rem); + transform: translateX(2.5rem); } + .md-header-nav__title[data-md-state="active"] .md-header-nav__topic + .md-header-nav__topic { + -webkit-transform: translateX(0); + transform: translateX(0); + transition: opacity 0.15s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s; + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + opacity: 1; + z-index: 0; + pointer-events: initial; } + .md-header-nav__source { + display: none; } + +.md-hero { + transition: background 0.25s; + background-color: #3f51b5; + color: white; + font-size: 2rem; + overflow: hidden; } + .md-hero__inner { + margin-top: 2rem; + padding: 1.6rem 1.6rem 0.8rem; + transition: opacity 0.25s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.25s; + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.25s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + transition-delay: 0.1s; } + [data-md-state="hidden"] .md-hero__inner { + pointer-events: none; + -webkit-transform: translateY(1.25rem); + transform: translateY(1.25rem); + transition: opacity 0.1s 0s, -webkit-transform 0s 0.4s; + transition: transform 0s 0.4s, opacity 0.1s 0s; + transition: transform 0s 0.4s, opacity 0.1s 0s, -webkit-transform 0s 0.4s; + opacity: 0; } + .md-hero--expand .md-hero__inner { + margin-bottom: 2.4rem; } + +.md-footer-nav { + background-color: rgba(0, 0, 0, 0.87); + color: white; } + .md-footer-nav__inner { + padding: 0.4rem; + overflow: auto; } + .md-footer-nav__link { + padding-top: 2.8rem; + padding-bottom: 0.8rem; + transition: opacity 0.25s; } + .md-footer-nav__link:hover { + opacity: 0.7; } + .md-footer-nav__link--prev { + width: 25%; + float: left; } + [dir="rtl"] .md-footer-nav__link--prev { + float: right; } + .md-footer-nav__link--next { + width: 75%; + float: right; + text-align: right; } + [dir="rtl"] .md-footer-nav__link--next { + float: left; + text-align: left; } + .md-footer-nav__button { + transition: background 0.25s; } + .md-footer-nav__title { + position: relative; + padding: 0 2rem; + font-size: 1.8rem; + line-height: 4.8rem; } + .md-footer-nav__direction { + position: absolute; + right: 0; + left: 0; + margin-top: -2rem; + padding: 0 2rem; + color: rgba(255, 255, 255, 0.7); + font-size: 1.5rem; } + +.md-footer-meta { + background-color: rgba(0, 0, 0, 0.895); } + .md-footer-meta__inner { + padding: 0.4rem; + overflow: auto; } + html .md-footer-meta.md-typeset a { + color: rgba(255, 255, 255, 0.7); } + html .md-footer-meta.md-typeset a:focus, html .md-footer-meta.md-typeset a:hover { + color: white; } + +.md-footer-copyright { + margin: 0 1.2rem; + padding: 0.8rem 0; + color: rgba(255, 255, 255, 0.3); + font-size: 1.28rem; } + .md-footer-copyright__highlight { + color: rgba(255, 255, 255, 0.7); } + +.md-footer-social { + margin: 0 0.8rem; + padding: 0.4rem 0 1.2rem; } + .md-footer-social__link { + display: inline-block; + width: 3.2rem; + height: 3.2rem; + font-size: 1.6rem; + text-align: center; } + .md-footer-social__link::before { + line-height: 1.9; } + +.md-nav { + font-size: 1.4rem; + line-height: 1.3; } + .md-nav__title { + display: block; + padding: 0 1.2rem; + font-weight: 700; + text-overflow: ellipsis; + overflow: hidden; } + .md-nav__title::before { + display: none; + content: "\E5C4"; } + [dir="rtl"] .md-nav__title::before { + content: "\E5C8"; } + .md-nav__title .md-nav__button { + display: none; } + .md-nav__list { + margin: 0; + padding: 0; + list-style: none; } + .md-nav__item { + padding: 0 1.2rem; } + .md-nav__item:last-child { + padding-bottom: 1.2rem; } + .md-nav__item .md-nav__item { + padding-right: 0; } + [dir="rtl"] .md-nav__item .md-nav__item { + padding-right: 1.2rem; + padding-left: 0; } + .md-nav__item .md-nav__item:last-child { + padding-bottom: 0; } + .md-nav__button img { + width: 100%; + height: auto; } + .md-nav__link { + display: block; + margin-top: 0.625em; + transition: color 0.125s; + text-overflow: ellipsis; + cursor: pointer; + overflow: hidden; } + .md-nav__item--nested > .md-nav__link::after { + content: "\E313"; } + html .md-nav__link[for="__toc"] { + display: none; } + html .md-nav__link[for="__toc"] ~ .md-nav { + display: none; } + html .md-nav__link[for="__toc"] + .md-nav__link::after { + display: none; } + .md-nav__link[data-md-state="blur"] { + color: rgba(0, 0, 0, 0.54); } + .md-nav__link:active, .md-nav__link--active { + color: #3f51b5; } + .md-nav__item--nested > .md-nav__link { + color: inherit; } + .md-nav__link:focus, .md-nav__link:hover { + color: #536dfe; } + .md-nav__source { + display: none; } + +.no-js .md-search { + display: none; } + +.md-search__overlay { + opacity: 0; + z-index: 1; } + +.md-search__form { + position: relative; } + +.md-search__input { + position: relative; + padding: 0 4.4rem 0 7.2rem; + text-overflow: ellipsis; + z-index: 2; } + [dir="rtl"] .md-search__input { + padding: 0 7.2rem 0 4.4rem; } + .md-search__input::-webkit-input-placeholder { + transition: color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); } + .md-search__input:-ms-input-placeholder { + transition: color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); } + .md-search__input::-ms-input-placeholder { + transition: color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); } + .md-search__input::placeholder { + transition: color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); } + .md-search__input ~ .md-search__icon, .md-search__input::-webkit-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + .md-search__input ~ .md-search__icon, .md-search__input:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + .md-search__input ~ .md-search__icon, .md-search__input::-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + .md-search__input ~ .md-search__icon, .md-search__input::placeholder { + color: rgba(0, 0, 0, 0.54); } + .md-search__input::-ms-clear { + display: none; } + +.md-search__icon { + position: absolute; + transition: color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.25s; + font-size: 2.4rem; + cursor: pointer; + z-index: 2; } + .md-search__icon:hover { + opacity: 0.7; } + .md-search__icon[for="__search"] { + top: 0.6rem; + left: 1rem; } + [dir="rtl"] .md-search__icon[for="__search"] { + right: 1rem; + left: initial; } + .md-search__icon[for="__search"]::before { + content: "\E8B6"; } + .md-search__icon[type="reset"] { + top: 0.6rem; + right: 1rem; + -webkit-transform: scale(0.125); + transform: scale(0.125); + transition: opacity 0.15s, -webkit-transform 0.15s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: transform 0.15s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s; + transition: transform 0.15s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s, -webkit-transform 0.15s cubic-bezier(0.1, 0.7, 0.1, 1); + opacity: 0; } + [dir="rtl"] .md-search__icon[type="reset"] { + right: initial; + left: 1rem; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input:valid ~ .md-search__icon[type="reset"] { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input:valid ~ .md-search__icon[type="reset"]:hover { + opacity: 0.7; } + +.md-search__output { + position: absolute; + width: 100%; + border-radius: 0 0 0.2rem 0.2rem; + overflow: hidden; + z-index: 1; } + +.md-search__scrollwrap { + height: 100%; + background-color: white; + box-shadow: 0 0.1rem 0 rgba(0, 0, 0, 0.07) inset; + overflow-y: auto; + -webkit-overflow-scrolling: touch; } + +.md-search-result { + color: rgba(0, 0, 0, 0.87); + word-break: break-word; } + .md-search-result__meta { + padding: 0 1.6rem; + background-color: rgba(0, 0, 0, 0.07); + color: rgba(0, 0, 0, 0.54); + font-size: 1.28rem; + line-height: 3.6rem; } + .md-search-result__list { + margin: 0; + padding: 0; + border-top: 0.1rem solid rgba(0, 0, 0, 0.07); + list-style: none; } + .md-search-result__item { + box-shadow: 0 -0.1rem 0 rgba(0, 0, 0, 0.07); } + .md-search-result__link { + display: block; + transition: background 0.25s; + outline: 0; + overflow: hidden; } + .md-search-result__link[data-md-state="active"], .md-search-result__link:hover { + background-color: rgba(83, 109, 254, 0.1); } + .md-search-result__link[data-md-state="active"] .md-search-result__article::before, .md-search-result__link:hover .md-search-result__article::before { + opacity: 0.7; } + .md-search-result__link:last-child .md-search-result__teaser { + margin-bottom: 1.2rem; } + .md-search-result__article { + position: relative; + padding: 0 1.6rem; + overflow: auto; } + .md-search-result__article--document::before { + position: absolute; + left: 0; + margin: 0.2rem; + transition: opacity 0.25s; + color: rgba(0, 0, 0, 0.54); + content: "\E880"; } + [dir="rtl"] .md-search-result__article--document::before { + right: 0; + left: initial; } + .md-search-result__article--document .md-search-result__title { + margin: 1.1rem 0; + font-size: 1.6rem; + font-weight: 400; + line-height: 1.4; } + .md-search-result__title { + margin: 0.5em 0; + font-size: 1.28rem; + font-weight: 700; + line-height: 1.4; } + .md-search-result__teaser { + display: -webkit-box; + max-height: 3.3rem; + margin: 0.5em 0; + color: rgba(0, 0, 0, 0.54); + font-size: 1.28rem; + line-height: 1.4; + text-overflow: ellipsis; + overflow: hidden; + -webkit-line-clamp: 2; } + .md-search-result em { + font-style: normal; + font-weight: 700; + text-decoration: underline; } + +.md-sidebar { + position: absolute; + width: 24.2rem; + padding: 2.4rem 0; + overflow: hidden; } + .md-sidebar[data-md-state="lock"] { + position: fixed; + top: 4.8rem; } + .md-sidebar--secondary { + display: none; } + .md-sidebar__scrollwrap { + max-height: 100%; + margin: 0 0.4rem; + overflow-y: auto; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + .md-sidebar__scrollwrap::-webkit-scrollbar { + width: 0.4rem; + height: 0.4rem; } + .md-sidebar__scrollwrap::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.26); } + .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + +@-webkit-keyframes md-source__facts--done { + 0% { + height: 0; } + 100% { + height: 1.3rem; } } + +@keyframes md-source__facts--done { + 0% { + height: 0; } + 100% { + height: 1.3rem; } } + +@-webkit-keyframes md-source__fact--done { + 0% { + -webkit-transform: translateY(100%); + transform: translateY(100%); + opacity: 0; } + 50% { + opacity: 0; } + 100% { + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; } } + +@keyframes md-source__fact--done { + 0% { + -webkit-transform: translateY(100%); + transform: translateY(100%); + opacity: 0; } + 50% { + opacity: 0; } + 100% { + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; } } + +.md-source { + display: block; + padding-right: 1.2rem; + transition: opacity 0.25s; + font-size: 1.3rem; + line-height: 1.2; + white-space: nowrap; } + [dir="rtl"] .md-source { + padding-right: initial; + padding-left: 1.2rem; } + .md-source:hover { + opacity: 0.7; } + .md-source::after { + display: inline-block; + height: 4.8rem; + content: ""; + vertical-align: middle; } + .md-source__icon { + display: inline-block; + width: 4.8rem; + height: 4.8rem; + content: ""; + vertical-align: middle; } + .md-source__icon svg { + width: 2.4rem; + height: 2.4rem; + margin-top: 1.2rem; + margin-left: 1.2rem; } + [dir="rtl"] .md-source__icon svg { + margin-right: 1.2rem; + margin-left: initial; } + .md-source__icon + .md-source__repository { + margin-left: -4.4rem; + padding-left: 4rem; } + [dir="rtl"] .md-source__icon + .md-source__repository { + margin-right: -4.4rem; + margin-left: initial; + padding-right: 4rem; + padding-left: initial; } + .md-source__repository { + display: inline-block; + max-width: 100%; + margin-left: 1.2rem; + font-weight: 700; + text-overflow: ellipsis; + overflow: hidden; + vertical-align: middle; } + .md-source__facts { + margin: 0; + padding: 0; + font-size: 1.1rem; + font-weight: 700; + list-style-type: none; + opacity: 0.75; + overflow: hidden; } + [data-md-state="done"] .md-source__facts { + -webkit-animation: md-source__facts--done 0.25s ease-in; + animation: md-source__facts--done 0.25s ease-in; } + .md-source__fact { + float: left; } + [dir="rtl"] .md-source__fact { + float: right; } + [data-md-state="done"] .md-source__fact { + -webkit-animation: md-source__fact--done 0.4s ease-out; + animation: md-source__fact--done 0.4s ease-out; } + .md-source__fact::before { + margin: 0 0.2rem; + content: "\B7"; } + .md-source__fact:first-child::before { + display: none; } + +.md-source-file { + display: inline-block; + margin: 1em 0.5em 1em 0; + padding-right: 0.5rem; + border-radius: 0.2rem; + background-color: rgba(0, 0, 0, 0.07); + font-size: 1.28rem; + list-style-type: none; + cursor: pointer; + overflow: hidden; } + .md-source-file::before { + display: inline-block; + margin-right: 0.5rem; + padding: 0.5rem; + background-color: rgba(0, 0, 0, 0.26); + color: white; + font-size: 1.6rem; + content: "\E86F"; + vertical-align: middle; } + html .md-source-file { + transition: background 0.4s, color 0.4s, box-shadow 0.4s cubic-bezier(0.4, 0, 0.2, 1); } + html .md-source-file::before { + transition: inherit; } + html body .md-typeset .md-source-file { + color: rgba(0, 0, 0, 0.54); } + .md-source-file:hover { + box-shadow: 0 0 8px rgba(0, 0, 0, 0.18), 0 8px 16px rgba(0, 0, 0, 0.36); } + .md-source-file:hover::before { + background-color: #536dfe; } + +.md-tabs { + width: 100%; + transition: background 0.25s; + background-color: #3f51b5; + color: white; + overflow: auto; } + .md-tabs__list { + margin: 0; + margin-left: 0.4rem; + padding: 0; + list-style: none; + white-space: nowrap; } + .md-tabs__item { + display: inline-block; + height: 4.8rem; + padding-right: 1.2rem; + padding-left: 1.2rem; } + .md-tabs__link { + display: block; + margin-top: 1.6rem; + transition: opacity 0.25s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.25s; + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.25s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + font-size: 1.4rem; + opacity: 0.7; } + .md-tabs__link--active, .md-tabs__link:hover { + color: inherit; + opacity: 1; } + .md-tabs__item:nth-child(2) .md-tabs__link { + transition-delay: 0.02s; } + .md-tabs__item:nth-child(3) .md-tabs__link { + transition-delay: 0.04s; } + .md-tabs__item:nth-child(4) .md-tabs__link { + transition-delay: 0.06s; } + .md-tabs__item:nth-child(5) .md-tabs__link { + transition-delay: 0.08s; } + .md-tabs__item:nth-child(6) .md-tabs__link { + transition-delay: 0.1s; } + .md-tabs__item:nth-child(7) .md-tabs__link { + transition-delay: 0.12s; } + .md-tabs__item:nth-child(8) .md-tabs__link { + transition-delay: 0.14s; } + .md-tabs__item:nth-child(9) .md-tabs__link { + transition-delay: 0.16s; } + .md-tabs__item:nth-child(10) .md-tabs__link { + transition-delay: 0.18s; } + .md-tabs__item:nth-child(11) .md-tabs__link { + transition-delay: 0.2s; } + .md-tabs__item:nth-child(12) .md-tabs__link { + transition-delay: 0.22s; } + .md-tabs__item:nth-child(13) .md-tabs__link { + transition-delay: 0.24s; } + .md-tabs__item:nth-child(14) .md-tabs__link { + transition-delay: 0.26s; } + .md-tabs__item:nth-child(15) .md-tabs__link { + transition-delay: 0.28s; } + .md-tabs__item:nth-child(16) .md-tabs__link { + transition-delay: 0.3s; } + .md-tabs[data-md-state="hidden"] { + pointer-events: none; } + .md-tabs[data-md-state="hidden"] .md-tabs__link { + -webkit-transform: translateY(50%); + transform: translateY(50%); + transition: color 0.25s, opacity 0.1s, -webkit-transform 0s 0.4s; + transition: color 0.25s, transform 0s 0.4s, opacity 0.1s; + transition: color 0.25s, transform 0s 0.4s, opacity 0.1s, -webkit-transform 0s 0.4s; + opacity: 0; } + +.md-typeset .admonition, .md-typeset details { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); + position: relative; + margin: 1.5625em 0; + padding: 0 1.2rem; + border-left: 0.4rem solid #448aff; + border-radius: 0.2rem; + font-size: 1.28rem; + overflow: auto; } + [dir="rtl"] .md-typeset .admonition, [dir="rtl"] .md-typeset details { + border-right: 0.4rem solid #448aff; + border-left: none; } + html .md-typeset .admonition > :last-child, html .md-typeset details > :last-child { + margin-bottom: 1.2rem; } + .md-typeset .admonition .admonition, .md-typeset details .admonition, .md-typeset .admonition details, .md-typeset details details { + margin: 1em 0; } + .md-typeset .admonition > .admonition-title, .md-typeset details > .admonition-title, .md-typeset .admonition > summary, .md-typeset details > summary { + margin: 0 -1.2rem; + padding: 0.8rem 1.2rem 0.8rem 4rem; + border-bottom: 0.1rem solid rgba(68, 138, 255, 0.1); + background-color: rgba(68, 138, 255, 0.1); + font-weight: 700; } + [dir="rtl"] .md-typeset .admonition > .admonition-title, [dir="rtl"] .md-typeset details > .admonition-title, [dir="rtl"] .md-typeset .admonition > summary, [dir="rtl"] .md-typeset details > summary { + padding: 0.8rem 4rem 0.8rem 1.2rem; } + .md-typeset .admonition > .admonition-title:last-child, .md-typeset details > .admonition-title:last-child, .md-typeset .admonition > summary:last-child, .md-typeset details > summary:last-child { + margin-bottom: 0; } + .md-typeset .admonition > .admonition-title::before, .md-typeset details > .admonition-title::before, .md-typeset .admonition > summary::before, .md-typeset details > summary::before { + position: absolute; + left: 1.2rem; + color: #448aff; + font-size: 2rem; + content: "\E3C9"; } + [dir="rtl"] .md-typeset .admonition > .admonition-title::before, [dir="rtl"] .md-typeset details > .admonition-title::before, [dir="rtl"] .md-typeset .admonition > summary::before, [dir="rtl"] .md-typeset details > summary::before { + right: 1.2rem; + left: initial; } + .md-typeset .admonition.summary, .md-typeset details.summary, .md-typeset .admonition.tldr, .md-typeset details.tldr, .md-typeset .admonition.abstract, .md-typeset details.abstract { + border-left-color: #00b0ff; } + [dir="rtl"] .md-typeset .admonition.summary, [dir="rtl"] .md-typeset details.summary, [dir="rtl"] .md-typeset .admonition.tldr, [dir="rtl"] .md-typeset details.tldr, [dir="rtl"] .md-typeset .admonition.abstract, [dir="rtl"] .md-typeset details.abstract { + border-right-color: #00b0ff; } + .md-typeset .admonition.summary > .admonition-title, .md-typeset details.summary > .admonition-title, .md-typeset .admonition.tldr > .admonition-title, .md-typeset details.tldr > .admonition-title, .md-typeset .admonition.summary > summary, .md-typeset details.summary > summary, .md-typeset .admonition.tldr > summary, .md-typeset details.tldr > summary, .md-typeset .admonition.abstract > .admonition-title, .md-typeset details.abstract > .admonition-title, .md-typeset .admonition.abstract > summary, .md-typeset details.abstract > summary { + border-bottom-color: 0.1rem solid rgba(0, 176, 255, 0.1); + background-color: rgba(0, 176, 255, 0.1); } + .md-typeset .admonition.summary > .admonition-title::before, .md-typeset details.summary > .admonition-title::before, .md-typeset .admonition.tldr > .admonition-title::before, .md-typeset details.tldr > .admonition-title::before, .md-typeset .admonition.summary > summary::before, .md-typeset details.summary > summary::before, .md-typeset .admonition.tldr > summary::before, .md-typeset details.tldr > summary::before, .md-typeset .admonition.abstract > .admonition-title::before, .md-typeset details.abstract > .admonition-title::before, .md-typeset .admonition.abstract > summary::before, .md-typeset details.abstract > summary::before { + color: #00b0ff; + content: "\E8D2"; } + .md-typeset .admonition.todo, .md-typeset details.todo, .md-typeset .admonition.info, .md-typeset details.info { + border-left-color: #00b8d4; } + [dir="rtl"] .md-typeset .admonition.todo, [dir="rtl"] .md-typeset details.todo, [dir="rtl"] .md-typeset .admonition.info, [dir="rtl"] .md-typeset details.info { + border-right-color: #00b8d4; } + .md-typeset .admonition.todo > .admonition-title, .md-typeset details.todo > .admonition-title, .md-typeset .admonition.todo > summary, .md-typeset details.todo > summary, .md-typeset .admonition.info > .admonition-title, .md-typeset details.info > .admonition-title, .md-typeset .admonition.info > summary, .md-typeset details.info > summary { + border-bottom-color: 0.1rem solid rgba(0, 184, 212, 0.1); + background-color: rgba(0, 184, 212, 0.1); } + .md-typeset .admonition.todo > .admonition-title::before, .md-typeset details.todo > .admonition-title::before, .md-typeset .admonition.todo > summary::before, .md-typeset details.todo > summary::before, .md-typeset .admonition.info > .admonition-title::before, .md-typeset details.info > .admonition-title::before, .md-typeset .admonition.info > summary::before, .md-typeset details.info > summary::before { + color: #00b8d4; + content: "\E88E"; } + .md-typeset .admonition.hint, .md-typeset details.hint, .md-typeset .admonition.important, .md-typeset details.important, .md-typeset .admonition.tip, .md-typeset details.tip { + border-left-color: #00bfa5; } + [dir="rtl"] .md-typeset .admonition.hint, [dir="rtl"] .md-typeset details.hint, [dir="rtl"] .md-typeset .admonition.important, [dir="rtl"] .md-typeset details.important, [dir="rtl"] .md-typeset .admonition.tip, [dir="rtl"] .md-typeset details.tip { + border-right-color: #00bfa5; } + .md-typeset .admonition.hint > .admonition-title, .md-typeset details.hint > .admonition-title, .md-typeset .admonition.important > .admonition-title, .md-typeset details.important > .admonition-title, .md-typeset .admonition.hint > summary, .md-typeset details.hint > summary, .md-typeset .admonition.important > summary, .md-typeset details.important > summary, .md-typeset .admonition.tip > .admonition-title, .md-typeset details.tip > .admonition-title, .md-typeset .admonition.tip > summary, .md-typeset details.tip > summary { + border-bottom-color: 0.1rem solid rgba(0, 191, 165, 0.1); + background-color: rgba(0, 191, 165, 0.1); } + .md-typeset .admonition.hint > .admonition-title::before, .md-typeset details.hint > .admonition-title::before, .md-typeset .admonition.important > .admonition-title::before, .md-typeset details.important > .admonition-title::before, .md-typeset .admonition.hint > summary::before, .md-typeset details.hint > summary::before, .md-typeset .admonition.important > summary::before, .md-typeset details.important > summary::before, .md-typeset .admonition.tip > .admonition-title::before, .md-typeset details.tip > .admonition-title::before, .md-typeset .admonition.tip > summary::before, .md-typeset details.tip > summary::before { + color: #00bfa5; + content: "\E80E"; } + .md-typeset .admonition.check, .md-typeset details.check, .md-typeset .admonition.done, .md-typeset details.done, .md-typeset .admonition.success, .md-typeset details.success { + border-left-color: #00c853; } + [dir="rtl"] .md-typeset .admonition.check, [dir="rtl"] .md-typeset details.check, [dir="rtl"] .md-typeset .admonition.done, [dir="rtl"] .md-typeset details.done, [dir="rtl"] .md-typeset .admonition.success, [dir="rtl"] .md-typeset details.success { + border-right-color: #00c853; } + .md-typeset .admonition.check > .admonition-title, .md-typeset details.check > .admonition-title, .md-typeset .admonition.done > .admonition-title, .md-typeset details.done > .admonition-title, .md-typeset .admonition.check > summary, .md-typeset details.check > summary, .md-typeset .admonition.done > summary, .md-typeset details.done > summary, .md-typeset .admonition.success > .admonition-title, .md-typeset details.success > .admonition-title, .md-typeset .admonition.success > summary, .md-typeset details.success > summary { + border-bottom-color: 0.1rem solid rgba(0, 200, 83, 0.1); + background-color: rgba(0, 200, 83, 0.1); } + .md-typeset .admonition.check > .admonition-title::before, .md-typeset details.check > .admonition-title::before, .md-typeset .admonition.done > .admonition-title::before, .md-typeset details.done > .admonition-title::before, .md-typeset .admonition.check > summary::before, .md-typeset details.check > summary::before, .md-typeset .admonition.done > summary::before, .md-typeset details.done > summary::before, .md-typeset .admonition.success > .admonition-title::before, .md-typeset details.success > .admonition-title::before, .md-typeset .admonition.success > summary::before, .md-typeset details.success > summary::before { + color: #00c853; + content: "\E876"; } + .md-typeset .admonition.help, .md-typeset details.help, .md-typeset .admonition.faq, .md-typeset details.faq, .md-typeset .admonition.question, .md-typeset details.question { + border-left-color: #64dd17; } + [dir="rtl"] .md-typeset .admonition.help, [dir="rtl"] .md-typeset details.help, [dir="rtl"] .md-typeset .admonition.faq, [dir="rtl"] .md-typeset details.faq, [dir="rtl"] .md-typeset .admonition.question, [dir="rtl"] .md-typeset details.question { + border-right-color: #64dd17; } + .md-typeset .admonition.help > .admonition-title, .md-typeset details.help > .admonition-title, .md-typeset .admonition.faq > .admonition-title, .md-typeset details.faq > .admonition-title, .md-typeset .admonition.help > summary, .md-typeset details.help > summary, .md-typeset .admonition.faq > summary, .md-typeset details.faq > summary, .md-typeset .admonition.question > .admonition-title, .md-typeset details.question > .admonition-title, .md-typeset .admonition.question > summary, .md-typeset details.question > summary { + border-bottom-color: 0.1rem solid rgba(100, 221, 23, 0.1); + background-color: rgba(100, 221, 23, 0.1); } + .md-typeset .admonition.help > .admonition-title::before, .md-typeset details.help > .admonition-title::before, .md-typeset .admonition.faq > .admonition-title::before, .md-typeset details.faq > .admonition-title::before, .md-typeset .admonition.help > summary::before, .md-typeset details.help > summary::before, .md-typeset .admonition.faq > summary::before, .md-typeset details.faq > summary::before, .md-typeset .admonition.question > .admonition-title::before, .md-typeset details.question > .admonition-title::before, .md-typeset .admonition.question > summary::before, .md-typeset details.question > summary::before { + color: #64dd17; + content: "\E887"; } + .md-typeset .admonition.caution, .md-typeset details.caution, .md-typeset .admonition.attention, .md-typeset details.attention, .md-typeset .admonition.warning, .md-typeset details.warning { + border-left-color: #ff9100; } + [dir="rtl"] .md-typeset .admonition.caution, [dir="rtl"] .md-typeset details.caution, [dir="rtl"] .md-typeset .admonition.attention, [dir="rtl"] .md-typeset details.attention, [dir="rtl"] .md-typeset .admonition.warning, [dir="rtl"] .md-typeset details.warning { + border-right-color: #ff9100; } + .md-typeset .admonition.caution > .admonition-title, .md-typeset details.caution > .admonition-title, .md-typeset .admonition.attention > .admonition-title, .md-typeset details.attention > .admonition-title, .md-typeset .admonition.caution > summary, .md-typeset details.caution > summary, .md-typeset .admonition.attention > summary, .md-typeset details.attention > summary, .md-typeset .admonition.warning > .admonition-title, .md-typeset details.warning > .admonition-title, .md-typeset .admonition.warning > summary, .md-typeset details.warning > summary { + border-bottom-color: 0.1rem solid rgba(255, 145, 0, 0.1); + background-color: rgba(255, 145, 0, 0.1); } + .md-typeset .admonition.caution > .admonition-title::before, .md-typeset details.caution > .admonition-title::before, .md-typeset .admonition.attention > .admonition-title::before, .md-typeset details.attention > .admonition-title::before, .md-typeset .admonition.caution > summary::before, .md-typeset details.caution > summary::before, .md-typeset .admonition.attention > summary::before, .md-typeset details.attention > summary::before, .md-typeset .admonition.warning > .admonition-title::before, .md-typeset details.warning > .admonition-title::before, .md-typeset .admonition.warning > summary::before, .md-typeset details.warning > summary::before { + color: #ff9100; + content: "\E002"; } + .md-typeset .admonition.fail, .md-typeset details.fail, .md-typeset .admonition.missing, .md-typeset details.missing, .md-typeset .admonition.failure, .md-typeset details.failure { + border-left-color: #ff5252; } + [dir="rtl"] .md-typeset .admonition.fail, [dir="rtl"] .md-typeset details.fail, [dir="rtl"] .md-typeset .admonition.missing, [dir="rtl"] .md-typeset details.missing, [dir="rtl"] .md-typeset .admonition.failure, [dir="rtl"] .md-typeset details.failure { + border-right-color: #ff5252; } + .md-typeset .admonition.fail > .admonition-title, .md-typeset details.fail > .admonition-title, .md-typeset .admonition.missing > .admonition-title, .md-typeset details.missing > .admonition-title, .md-typeset .admonition.fail > summary, .md-typeset details.fail > summary, .md-typeset .admonition.missing > summary, .md-typeset details.missing > summary, .md-typeset .admonition.failure > .admonition-title, .md-typeset details.failure > .admonition-title, .md-typeset .admonition.failure > summary, .md-typeset details.failure > summary { + border-bottom-color: 0.1rem solid rgba(255, 82, 82, 0.1); + background-color: rgba(255, 82, 82, 0.1); } + .md-typeset .admonition.fail > .admonition-title::before, .md-typeset details.fail > .admonition-title::before, .md-typeset .admonition.missing > .admonition-title::before, .md-typeset details.missing > .admonition-title::before, .md-typeset .admonition.fail > summary::before, .md-typeset details.fail > summary::before, .md-typeset .admonition.missing > summary::before, .md-typeset details.missing > summary::before, .md-typeset .admonition.failure > .admonition-title::before, .md-typeset details.failure > .admonition-title::before, .md-typeset .admonition.failure > summary::before, .md-typeset details.failure > summary::before { + color: #ff5252; + content: "\E14C"; } + .md-typeset .admonition.error, .md-typeset details.error, .md-typeset .admonition.danger, .md-typeset details.danger { + border-left-color: #ff1744; } + [dir="rtl"] .md-typeset .admonition.error, [dir="rtl"] .md-typeset details.error, [dir="rtl"] .md-typeset .admonition.danger, [dir="rtl"] .md-typeset details.danger { + border-right-color: #ff1744; } + .md-typeset .admonition.error > .admonition-title, .md-typeset details.error > .admonition-title, .md-typeset .admonition.error > summary, .md-typeset details.error > summary, .md-typeset .admonition.danger > .admonition-title, .md-typeset details.danger > .admonition-title, .md-typeset .admonition.danger > summary, .md-typeset details.danger > summary { + border-bottom-color: 0.1rem solid rgba(255, 23, 68, 0.1); + background-color: rgba(255, 23, 68, 0.1); } + .md-typeset .admonition.error > .admonition-title::before, .md-typeset details.error > .admonition-title::before, .md-typeset .admonition.error > summary::before, .md-typeset details.error > summary::before, .md-typeset .admonition.danger > .admonition-title::before, .md-typeset details.danger > .admonition-title::before, .md-typeset .admonition.danger > summary::before, .md-typeset details.danger > summary::before { + color: #ff1744; + content: "\E3E7"; } + .md-typeset .admonition.bug, .md-typeset details.bug { + border-left-color: #f50057; } + [dir="rtl"] .md-typeset .admonition.bug, [dir="rtl"] .md-typeset details.bug { + border-right-color: #f50057; } + .md-typeset .admonition.bug > .admonition-title, .md-typeset details.bug > .admonition-title, .md-typeset .admonition.bug > summary, .md-typeset details.bug > summary { + border-bottom-color: 0.1rem solid rgba(245, 0, 87, 0.1); + background-color: rgba(245, 0, 87, 0.1); } + .md-typeset .admonition.bug > .admonition-title::before, .md-typeset details.bug > .admonition-title::before, .md-typeset .admonition.bug > summary::before, .md-typeset details.bug > summary::before { + color: #f50057; + content: "\E868"; } + .md-typeset .admonition.example, .md-typeset details.example { + border-left-color: #651fff; } + [dir="rtl"] .md-typeset .admonition.example, [dir="rtl"] .md-typeset details.example { + border-right-color: #651fff; } + .md-typeset .admonition.example > .admonition-title, .md-typeset details.example > .admonition-title, .md-typeset .admonition.example > summary, .md-typeset details.example > summary { + border-bottom-color: 0.1rem solid rgba(101, 31, 255, 0.1); + background-color: rgba(101, 31, 255, 0.1); } + .md-typeset .admonition.example > .admonition-title::before, .md-typeset details.example > .admonition-title::before, .md-typeset .admonition.example > summary::before, .md-typeset details.example > summary::before { + color: #651fff; + content: "\E242"; } + .md-typeset .admonition.cite, .md-typeset details.cite, .md-typeset .admonition.quote, .md-typeset details.quote { + border-left-color: #9e9e9e; } + [dir="rtl"] .md-typeset .admonition.cite, [dir="rtl"] .md-typeset details.cite, [dir="rtl"] .md-typeset .admonition.quote, [dir="rtl"] .md-typeset details.quote { + border-right-color: #9e9e9e; } + .md-typeset .admonition.cite > .admonition-title, .md-typeset details.cite > .admonition-title, .md-typeset .admonition.cite > summary, .md-typeset details.cite > summary, .md-typeset .admonition.quote > .admonition-title, .md-typeset details.quote > .admonition-title, .md-typeset .admonition.quote > summary, .md-typeset details.quote > summary { + border-bottom-color: 0.1rem solid rgba(158, 158, 158, 0.1); + background-color: rgba(158, 158, 158, 0.1); } + .md-typeset .admonition.cite > .admonition-title::before, .md-typeset details.cite > .admonition-title::before, .md-typeset .admonition.cite > summary::before, .md-typeset details.cite > summary::before, .md-typeset .admonition.quote > .admonition-title::before, .md-typeset details.quote > .admonition-title::before, .md-typeset .admonition.quote > summary::before, .md-typeset details.quote > summary::before { + color: #9e9e9e; + content: "\E244"; } + +.codehilite .o, .md-typeset .highlight .o { + color: inherit; } + +.codehilite .ow, .md-typeset .highlight .ow { + color: inherit; } + +.codehilite .ge, .md-typeset .highlight .ge { + color: #000000; } + +.codehilite .gr, .md-typeset .highlight .gr { + color: #AA0000; } + +.codehilite .gh, .md-typeset .highlight .gh { + color: #999999; } + +.codehilite .go, .md-typeset .highlight .go { + color: #888888; } + +.codehilite .gp, .md-typeset .highlight .gp { + color: #555555; } + +.codehilite .gs, .md-typeset .highlight .gs { + color: inherit; } + +.codehilite .gu, .md-typeset .highlight .gu { + color: #AAAAAA; } + +.codehilite .gt, .md-typeset .highlight .gt { + color: #AA0000; } + +.codehilite .gd, .md-typeset .highlight .gd { + background-color: #FFDDDD; } + +.codehilite .gi, .md-typeset .highlight .gi { + background-color: #DDFFDD; } + +.codehilite .k, .md-typeset .highlight .k { + color: #3B78E7; } + +.codehilite .kc, .md-typeset .highlight .kc { + color: #A71D5D; } + +.codehilite .kd, .md-typeset .highlight .kd { + color: #3B78E7; } + +.codehilite .kn, .md-typeset .highlight .kn { + color: #3B78E7; } + +.codehilite .kp, .md-typeset .highlight .kp { + color: #A71D5D; } + +.codehilite .kr, .md-typeset .highlight .kr { + color: #3E61A2; } + +.codehilite .kt, .md-typeset .highlight .kt { + color: #3E61A2; } + +.codehilite .c, .md-typeset .highlight .c { + color: #999999; } + +.codehilite .cm, .md-typeset .highlight .cm { + color: #999999; } + +.codehilite .cp, .md-typeset .highlight .cp { + color: #666666; } + +.codehilite .c1, .md-typeset .highlight .c1 { + color: #999999; } + +.codehilite .ch, .md-typeset .highlight .ch { + color: #999999; } + +.codehilite .cs, .md-typeset .highlight .cs { + color: #999999; } + +.codehilite .na, .md-typeset .highlight .na { + color: #C2185B; } + +.codehilite .nb, .md-typeset .highlight .nb { + color: #C2185B; } + +.codehilite .bp, .md-typeset .highlight .bp { + color: #3E61A2; } + +.codehilite .nc, .md-typeset .highlight .nc { + color: #C2185B; } + +.codehilite .no, .md-typeset .highlight .no { + color: #3E61A2; } + +.codehilite .nd, .md-typeset .highlight .nd { + color: #666666; } + +.codehilite .ni, .md-typeset .highlight .ni { + color: #666666; } + +.codehilite .ne, .md-typeset .highlight .ne { + color: #C2185B; } + +.codehilite .nf, .md-typeset .highlight .nf { + color: #C2185B; } + +.codehilite .nl, .md-typeset .highlight .nl { + color: #3B5179; } + +.codehilite .nn, .md-typeset .highlight .nn { + color: #EC407A; } + +.codehilite .nt, .md-typeset .highlight .nt { + color: #3B78E7; } + +.codehilite .nv, .md-typeset .highlight .nv { + color: #3E61A2; } + +.codehilite .vc, .md-typeset .highlight .vc { + color: #3E61A2; } + +.codehilite .vg, .md-typeset .highlight .vg { + color: #3E61A2; } + +.codehilite .vi, .md-typeset .highlight .vi { + color: #3E61A2; } + +.codehilite .nx, .md-typeset .highlight .nx { + color: #EC407A; } + +.codehilite .m, .md-typeset .highlight .m { + color: #E74C3C; } + +.codehilite .mf, .md-typeset .highlight .mf { + color: #E74C3C; } + +.codehilite .mh, .md-typeset .highlight .mh { + color: #E74C3C; } + +.codehilite .mi, .md-typeset .highlight .mi { + color: #E74C3C; } + +.codehilite .il, .md-typeset .highlight .il { + color: #E74C3C; } + +.codehilite .mo, .md-typeset .highlight .mo { + color: #E74C3C; } + +.codehilite .s, .md-typeset .highlight .s { + color: #0D904F; } + +.codehilite .sb, .md-typeset .highlight .sb { + color: #0D904F; } + +.codehilite .sc, .md-typeset .highlight .sc { + color: #0D904F; } + +.codehilite .sd, .md-typeset .highlight .sd { + color: #999999; } + +.codehilite .s2, .md-typeset .highlight .s2 { + color: #0D904F; } + +.codehilite .se, .md-typeset .highlight .se { + color: #183691; } + +.codehilite .sh, .md-typeset .highlight .sh { + color: #183691; } + +.codehilite .si, .md-typeset .highlight .si { + color: #183691; } + +.codehilite .sx, .md-typeset .highlight .sx { + color: #183691; } + +.codehilite .sr, .md-typeset .highlight .sr { + color: #009926; } + +.codehilite .s1, .md-typeset .highlight .s1 { + color: #0D904F; } + +.codehilite .ss, .md-typeset .highlight .ss { + color: #0D904F; } + +.codehilite .err, .md-typeset .highlight .err { + color: #A61717; } + +.codehilite .w, .md-typeset .highlight .w { + color: transparent; } + +.codehilite .hll, .md-typeset .highlight .hll { + display: block; + margin: 0 -1.2rem; + padding: 0 1.2rem; + background-color: rgba(255, 235, 59, 0.5); } + +.md-typeset .codehilite, .md-typeset .highlight { + position: relative; + margin: 1em 0; + padding: 0; + border-radius: 0.2rem; + background-color: rgba(236, 236, 236, 0.5); + color: #37474F; + line-height: 1.4; + -webkit-overflow-scrolling: touch; } + .md-typeset .codehilite pre, .md-typeset .highlight pre, + .md-typeset .codehilite code, .md-typeset .highlight code { + display: block; + margin: 0; + padding: 1.05rem 1.2rem; + background-color: transparent; + overflow: auto; + vertical-align: top; } + .md-typeset .codehilite pre::-webkit-scrollbar, .md-typeset .highlight pre::-webkit-scrollbar, + .md-typeset .codehilite code::-webkit-scrollbar, .md-typeset .highlight code::-webkit-scrollbar { + width: 0.4rem; + height: 0.4rem; } + .md-typeset .codehilite pre::-webkit-scrollbar-thumb, .md-typeset .highlight pre::-webkit-scrollbar-thumb, + .md-typeset .codehilite code::-webkit-scrollbar-thumb, .md-typeset .highlight code::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.26); } + .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, .md-typeset .highlight pre::-webkit-scrollbar-thumb:hover, + .md-typeset .codehilite code::-webkit-scrollbar-thumb:hover, .md-typeset .highlight code::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + +.md-typeset pre.codehilite, .md-typeset pre.highlight { + overflow: visible; } + .md-typeset pre.codehilite code, .md-typeset pre.highlight code { + display: block; + padding: 1.05rem 1.2rem; + overflow: auto; } + +.md-typeset .codehilitetable, .md-typeset .highlighttable { + display: block; + margin: 1em 0; + border-radius: 0.2em; + font-size: 1.6rem; + overflow: hidden; } + .md-typeset .codehilitetable tbody, .md-typeset .highlighttable tbody, + .md-typeset .codehilitetable td, .md-typeset .highlighttable td { + display: block; + padding: 0; } + .md-typeset .codehilitetable tr, .md-typeset .highlighttable tr { + display: flex; } + .md-typeset .codehilitetable .codehilite, .md-typeset .highlighttable .codehilite, .md-typeset .codehilitetable .highlight, .md-typeset .highlighttable .highlight, + .md-typeset .codehilitetable .linenodiv, .md-typeset .highlighttable .linenodiv { + margin: 0; + border-radius: 0; } + .md-typeset .codehilitetable .linenodiv, .md-typeset .highlighttable .linenodiv { + padding: 1.05rem 1.2rem; } + .md-typeset .codehilitetable .linenos, .md-typeset .highlighttable .linenos { + background-color: rgba(0, 0, 0, 0.07); + color: rgba(0, 0, 0, 0.26); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .md-typeset .codehilitetable .linenos pre, .md-typeset .highlighttable .linenos pre { + margin: 0; + padding: 0; + background-color: transparent; + color: inherit; + text-align: right; } + .md-typeset .codehilitetable .code, .md-typeset .highlighttable .code { + flex: 1; + overflow: hidden; } + +.md-typeset > .codehilitetable, .md-typeset > .highlighttable { + box-shadow: none; } + +.md-typeset [id^="fnref:"] { + display: inline-block; } + .md-typeset [id^="fnref:"]:target { + margin-top: -7.6rem; + padding-top: 7.6rem; + pointer-events: none; } + +.md-typeset [id^="fn:"]::before { + display: none; + height: 0; + content: ""; } + +.md-typeset [id^="fn:"]:target::before { + display: block; + margin-top: -7rem; + padding-top: 7rem; + pointer-events: none; } + +.md-typeset .footnote { + color: rgba(0, 0, 0, 0.54); + font-size: 1.28rem; } + .md-typeset .footnote ol { + margin-left: 0; } + .md-typeset .footnote li { + transition: color 0.25s; } + .md-typeset .footnote li:target { + color: rgba(0, 0, 0, 0.87); } + .md-typeset .footnote li :first-child { + margin-top: 0; } + .md-typeset .footnote li:hover .footnote-backref, + .md-typeset .footnote li:target .footnote-backref { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; } + .md-typeset .footnote li:hover .footnote-backref:hover, + .md-typeset .footnote li:target .footnote-backref { + color: #536dfe; } + +.md-typeset .footnote-ref { + display: inline-block; + pointer-events: initial; } + .md-typeset .footnote-ref::before { + display: inline; + margin: 0 0.2em; + border-left: 0.1rem solid rgba(0, 0, 0, 0.26); + font-size: 1.25em; + content: ""; + vertical-align: -0.5rem; } + +.md-typeset .footnote-backref { + display: inline-block; + -webkit-transform: translateX(0.5rem); + transform: translateX(0.5rem); + transition: color 0.25s, opacity 0.125s 0.125s, -webkit-transform 0.25s 0.125s; + transition: transform 0.25s 0.125s, color 0.25s, opacity 0.125s 0.125s; + transition: transform 0.25s 0.125s, color 0.25s, opacity 0.125s 0.125s, -webkit-transform 0.25s 0.125s; + color: rgba(0, 0, 0, 0.26); + font-size: 0; + opacity: 0; + vertical-align: text-bottom; } + [dir="rtl"] .md-typeset .footnote-backref { + -webkit-transform: translateX(-0.5rem); + transform: translateX(-0.5rem); } + .md-typeset .footnote-backref::before { + display: inline-block; + font-size: 1.6rem; + content: "\E31B"; } + [dir="rtl"] .md-typeset .footnote-backref::before { + -webkit-transform: scaleX(-1); + transform: scaleX(-1); } + +.md-typeset .headerlink { + display: inline-block; + margin-left: 1rem; + -webkit-transform: translate(0, 0.5rem); + transform: translate(0, 0.5rem); + transition: color 0.25s, opacity 0.125s 0.25s, -webkit-transform 0.25s 0.25s; + transition: transform 0.25s 0.25s, color 0.25s, opacity 0.125s 0.25s; + transition: transform 0.25s 0.25s, color 0.25s, opacity 0.125s 0.25s, -webkit-transform 0.25s 0.25s; + opacity: 0; } + [dir="rtl"] .md-typeset .headerlink { + margin-right: 1rem; + margin-left: initial; } + html body .md-typeset .headerlink { + color: rgba(0, 0, 0, 0.26); } + +.md-typeset h1[id]::before { + display: block; + margin-top: -0.9rem; + padding-top: 0.9rem; + content: ""; } + +.md-typeset h1[id]:target::before { + margin-top: -6.9rem; + padding-top: 6.9rem; } + +.md-typeset h1[id]:hover .headerlink, +.md-typeset h1[id]:target .headerlink, +.md-typeset h1[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h1[id]:hover .headerlink:hover, +.md-typeset h1[id]:target .headerlink, +.md-typeset h1[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset h2[id]::before { + display: block; + margin-top: -0.8rem; + padding-top: 0.8rem; + content: ""; } + +.md-typeset h2[id]:target::before { + margin-top: -6.8rem; + padding-top: 6.8rem; } + +.md-typeset h2[id]:hover .headerlink, +.md-typeset h2[id]:target .headerlink, +.md-typeset h2[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h2[id]:hover .headerlink:hover, +.md-typeset h2[id]:target .headerlink, +.md-typeset h2[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset h3[id]::before { + display: block; + margin-top: -0.9rem; + padding-top: 0.9rem; + content: ""; } + +.md-typeset h3[id]:target::before { + margin-top: -6.9rem; + padding-top: 6.9rem; } + +.md-typeset h3[id]:hover .headerlink, +.md-typeset h3[id]:target .headerlink, +.md-typeset h3[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h3[id]:hover .headerlink:hover, +.md-typeset h3[id]:target .headerlink, +.md-typeset h3[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset h4[id]::before { + display: block; + margin-top: -0.9rem; + padding-top: 0.9rem; + content: ""; } + +.md-typeset h4[id]:target::before { + margin-top: -6.9rem; + padding-top: 6.9rem; } + +.md-typeset h4[id]:hover .headerlink, +.md-typeset h4[id]:target .headerlink, +.md-typeset h4[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h4[id]:hover .headerlink:hover, +.md-typeset h4[id]:target .headerlink, +.md-typeset h4[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset h5[id]::before { + display: block; + margin-top: -1.1rem; + padding-top: 1.1rem; + content: ""; } + +.md-typeset h5[id]:target::before { + margin-top: -7.1rem; + padding-top: 7.1rem; } + +.md-typeset h5[id]:hover .headerlink, +.md-typeset h5[id]:target .headerlink, +.md-typeset h5[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h5[id]:hover .headerlink:hover, +.md-typeset h5[id]:target .headerlink, +.md-typeset h5[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset h6[id]::before { + display: block; + margin-top: -1.1rem; + padding-top: 1.1rem; + content: ""; } + +.md-typeset h6[id]:target::before { + margin-top: -7.1rem; + padding-top: 7.1rem; } + +.md-typeset h6[id]:hover .headerlink, +.md-typeset h6[id]:target .headerlink, +.md-typeset h6[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h6[id]:hover .headerlink:hover, +.md-typeset h6[id]:target .headerlink, +.md-typeset h6[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset .MJXc-display { + margin: 0.75em 0; + padding: 0.75em 0; + overflow: auto; + -webkit-overflow-scrolling: touch; } + +.md-typeset .MathJax_CHTML { + outline: 0; } + +.md-typeset del.critic, +.md-typeset ins.critic, +.md-typeset .critic.comment { + margin: 0 0.25em; + padding: 0.0625em 0; + border-radius: 0.2rem; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; } + +.md-typeset del.critic { + background-color: #FFDDDD; + box-shadow: 0.25em 0 0 #FFDDDD, -0.25em 0 0 #FFDDDD; } + +.md-typeset ins.critic { + background-color: #DDFFDD; + box-shadow: 0.25em 0 0 #DDFFDD, -0.25em 0 0 #DDFFDD; } + +.md-typeset .critic.comment { + background-color: rgba(236, 236, 236, 0.5); + color: #37474F; + box-shadow: 0.25em 0 0 rgba(236, 236, 236, 0.5), -0.25em 0 0 rgba(236, 236, 236, 0.5); } + .md-typeset .critic.comment::before { + padding-right: 0.125em; + color: rgba(0, 0, 0, 0.26); + content: "\E0B7"; + vertical-align: -0.125em; } + +.md-typeset .critic.block { + display: block; + margin: 1em 0; + padding-right: 1.6rem; + padding-left: 1.6rem; + box-shadow: none; } + .md-typeset .critic.block :first-child { + margin-top: 0.5em; } + .md-typeset .critic.block :last-child { + margin-bottom: 0.5em; } + +.md-typeset details { + display: block; + padding-top: 0; } + .md-typeset details[open] > summary::after { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + .md-typeset details:not([open]) { + padding-bottom: 0; } + .md-typeset details:not([open]) > summary { + border-bottom: none; } + .md-typeset details summary { + padding-right: 4rem; } + [dir="rtl"] .md-typeset details summary { + padding-left: 4rem; } + .no-details .md-typeset details:not([open]) > * { + display: none; } + .no-details .md-typeset details:not([open]) summary { + display: block; } + +.md-typeset summary { + display: block; + outline: none; + cursor: pointer; } + .md-typeset summary::-webkit-details-marker { + display: none; } + .md-typeset summary::after { + position: absolute; + top: 0.8rem; + right: 1.2rem; + color: rgba(0, 0, 0, 0.26); + font-size: 2rem; + content: "\E313"; } + [dir="rtl"] .md-typeset summary::after { + right: initial; + left: 1.2rem; } + +.md-typeset .emojione { + width: 2rem; + vertical-align: text-top; } + +.md-typeset code.codehilite, .md-typeset code.highlight { + margin: 0 0.29412em; + padding: 0.07353em 0; } + +.md-typeset .superfences-content { + display: none; + order: 99; + width: 100%; + background-color: white; } + .md-typeset .superfences-content > * { + margin: 0; + border-radius: 0; } + +.md-typeset .superfences-tabs { + display: flex; + position: relative; + flex-wrap: wrap; + margin: 1em 0; + border: 0.1rem solid rgba(0, 0, 0, 0.07); + border-radius: 0.2em; } + .md-typeset .superfences-tabs > input { + display: none; } + .md-typeset .superfences-tabs > input:checked + label { + font-weight: 700; } + .md-typeset .superfences-tabs > input:checked + label + .superfences-content { + display: block; } + .md-typeset .superfences-tabs > label { + width: auto; + padding: 1.2rem 1.2rem; + transition: color 0.125s; + font-size: 1.28rem; + cursor: pointer; } + html .md-typeset .superfences-tabs > label:hover { + color: #536dfe; } + +.md-typeset .task-list-item { + position: relative; + list-style-type: none; } + .md-typeset .task-list-item [type="checkbox"] { + position: absolute; + top: 0.45em; + left: -2em; } + [dir="rtl"] .md-typeset .task-list-item [type="checkbox"] { + right: -2em; + left: initial; } + +.md-typeset .task-list-control .task-list-indicator::before { + position: absolute; + top: 0.15em; + left: -1.25em; + color: rgba(0, 0, 0, 0.26); + font-size: 1.25em; + content: "\E835"; + vertical-align: -0.25em; } + [dir="rtl"] .md-typeset .task-list-control .task-list-indicator::before { + right: -1.25em; + left: initial; } + +.md-typeset .task-list-control [type="checkbox"]:checked + .task-list-indicator::before { + content: "\E834"; } + +.md-typeset .task-list-control [type="checkbox"] { + opacity: 0; + z-index: -1; } + +@media print { + .md-typeset a::after { + color: rgba(0, 0, 0, 0.54); + content: " [" attr(href) "]"; } + .md-typeset code, + .md-typeset pre { + white-space: pre-wrap; } + .md-typeset code { + box-shadow: none; + -webkit-box-decoration-break: initial; + box-decoration-break: initial; } + .md-clipboard { + display: none; } + .md-content__icon { + display: none; } + .md-header { + display: none; } + .md-footer { + display: none; } + .md-sidebar { + display: none; } + .md-tabs { + display: none; } + .md-typeset .headerlink { + display: none; } } + +@media only screen and (max-width: 44.9375em) { + .md-typeset pre { + margin: 1em -1.6rem; + border-radius: 0; } + .md-typeset pre > code { + padding: 1.05rem 1.6rem; } + .md-footer-nav__link--prev .md-footer-nav__title { + display: none; } + .md-search-result__teaser { + max-height: 5rem; + -webkit-line-clamp: 3; } + .codehilite .hll, .md-typeset .highlight .hll { + margin: 0 -1.6rem; + padding: 0 1.6rem; } + .md-typeset > .codehilite, .md-typeset > .highlight { + margin: 1em -1.6rem; + border-radius: 0; } + .md-typeset > .codehilite pre, .md-typeset > .highlight pre, + .md-typeset > .codehilite code, + .md-typeset > .highlight code { + padding: 1.05rem 1.6rem; } + .md-typeset > .codehilitetable, .md-typeset > .highlighttable { + margin: 1em -1.6rem; + border-radius: 0; } + .md-typeset > .codehilitetable .codehilite > pre, .md-typeset > .highlighttable .codehilite > pre, .md-typeset > .codehilitetable .highlight > pre, .md-typeset > .highlighttable .highlight > pre, + .md-typeset > .codehilitetable .codehilite > code, + .md-typeset > .highlighttable .codehilite > code, .md-typeset > .codehilitetable .highlight > code, .md-typeset > .highlighttable .highlight > code, + .md-typeset > .codehilitetable .linenodiv, + .md-typeset > .highlighttable .linenodiv { + padding: 1rem 1.6rem; } + .md-typeset > p > .MJXc-display { + margin: 0.75em -1.6rem; + padding: 0.25em 1.6rem; } + .md-typeset > .superfences-tabs { + margin: 1em -1.6rem; + border: 0; + border-top: 0.1rem solid rgba(0, 0, 0, 0.07); + border-radius: 0; } + .md-typeset > .superfences-tabs pre, + .md-typeset > .superfences-tabs code { + padding: 1.05rem 1.6rem; } } + +@media only screen and (min-width: 100em) { + html { + font-size: 68.75%; } } + +@media only screen and (min-width: 125em) { + html { + font-size: 75%; } } + +@media only screen and (max-width: 59.9375em) { + body[data-md-state="lock"] { + overflow: hidden; } + .ios body[data-md-state="lock"] .md-container { + display: none; } + html .md-nav__link[for="__toc"] { + display: block; + padding-right: 4.8rem; } + html .md-nav__link[for="__toc"]::after { + color: inherit; + content: "\E8DE"; } + html .md-nav__link[for="__toc"] + .md-nav__link { + display: none; } + html .md-nav__link[for="__toc"] ~ .md-nav { + display: flex; } + html [dir="rtl"] .md-nav__link { + padding-right: 1.6rem; + padding-left: 4.8rem; } + .md-nav__source { + display: block; + padding: 0 0.4rem; + background-color: rgba(50, 64, 144, 0.9675); + color: white; } + .md-search__overlay { + position: absolute; + top: 0.4rem; + left: 0.4rem; + width: 3.6rem; + height: 3.6rem; + -webkit-transform-origin: center; + transform-origin: center; + transition: opacity 0.2s 0.2s, -webkit-transform 0.3s 0.1s; + transition: transform 0.3s 0.1s, opacity 0.2s 0.2s; + transition: transform 0.3s 0.1s, opacity 0.2s 0.2s, -webkit-transform 0.3s 0.1s; + border-radius: 2rem; + background-color: white; + overflow: hidden; + pointer-events: none; } + [dir="rtl"] .md-search__overlay { + right: 0.4rem; + left: initial; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__overlay { + transition: opacity 0.1s, -webkit-transform 0.4s; + transition: transform 0.4s, opacity 0.1s; + transition: transform 0.4s, opacity 0.1s, -webkit-transform 0.4s; + opacity: 1; } + .md-search__inner { + position: fixed; + top: 0; + left: 100%; + width: 100%; + height: 100%; + -webkit-transform: translateX(5%); + transform: translateX(5%); + transition: right 0s 0.3s, left 0s 0.3s, opacity 0.15s 0.15s, -webkit-transform 0.15s 0.15s cubic-bezier(0.4, 0, 0.2, 1); + transition: right 0s 0.3s, left 0s 0.3s, transform 0.15s 0.15s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.15s 0.15s; + transition: right 0s 0.3s, left 0s 0.3s, transform 0.15s 0.15s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.15s 0.15s, -webkit-transform 0.15s 0.15s cubic-bezier(0.4, 0, 0.2, 1); + opacity: 0; + z-index: 2; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__inner { + left: 0; + -webkit-transform: translateX(0); + transform: translateX(0); + transition: right 0s 0s, left 0s 0s, opacity 0.15s 0.15s, -webkit-transform 0.15s 0.15s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: right 0s 0s, left 0s 0s, transform 0.15s 0.15s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s 0.15s; + transition: right 0s 0s, left 0s 0s, transform 0.15s 0.15s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s 0.15s, -webkit-transform 0.15s 0.15s cubic-bezier(0.1, 0.7, 0.1, 1); + opacity: 1; } + [dir="rtl"] [data-md-toggle="search"]:checked ~ .md-header .md-search__inner { + right: 0; + left: initial; } + html [dir="rtl"] .md-search__inner { + right: 100%; + left: initial; + -webkit-transform: translateX(-5%); + transform: translateX(-5%); } + .md-search__input { + width: 100%; + height: 4.8rem; + font-size: 1.8rem; } + .md-search__icon[for="__search"] { + top: 1.2rem; + left: 1.6rem; } + .md-search__icon[for="__search"][for="__search"]::before { + content: "\E5C4"; } + [dir="rtl"] .md-search__icon[for="__search"][for="__search"]::before { + content: "\E5C8"; } + .md-search__icon[type="reset"] { + top: 1.2rem; + right: 1.6rem; } + .md-search__output { + top: 4.8rem; + bottom: 0; } + .md-search-result__article--document::before { + display: none; } } + +@media only screen and (max-width: 76.1875em) { + [data-md-toggle="drawer"]:checked ~ .md-overlay { + width: 100%; + height: 100%; + transition: width 0s, height 0s, opacity 0.25s; + opacity: 1; } + .md-header-nav__button.md-icon--home, .md-header-nav__button.md-logo { + display: none; } + .md-hero__inner { + margin-top: 4.8rem; + margin-bottom: 2.4rem; } + .md-nav { + background-color: white; } + .md-nav--primary, + .md-nav--primary .md-nav { + display: flex; + position: absolute; + top: 0; + right: 0; + left: 0; + flex-direction: column; + height: 100%; + z-index: 1; } + .md-nav--primary .md-nav__title, + .md-nav--primary .md-nav__item { + font-size: 1.6rem; + line-height: 1.5; } + html .md-nav--primary .md-nav__title { + position: relative; + height: 11.2rem; + padding: 6rem 1.6rem 0.4rem; + background-color: rgba(0, 0, 0, 0.07); + color: rgba(0, 0, 0, 0.54); + font-weight: 400; + line-height: 4.8rem; + white-space: nowrap; + cursor: pointer; } + html .md-nav--primary .md-nav__title::before { + display: block; + position: absolute; + top: 0.4rem; + left: 0.4rem; + width: 4rem; + height: 4rem; + color: rgba(0, 0, 0, 0.54); } + html .md-nav--primary .md-nav__title ~ .md-nav__list { + background-color: white; + box-shadow: 0 0.1rem 0 rgba(0, 0, 0, 0.07) inset; } + html .md-nav--primary .md-nav__title ~ .md-nav__list > .md-nav__item:first-child { + border-top: 0; } + html .md-nav--primary .md-nav__title--site { + position: relative; + background-color: #3f51b5; + color: white; } + html .md-nav--primary .md-nav__title--site .md-nav__button { + display: block; + position: absolute; + top: 0.4rem; + left: 0.4rem; + width: 6.4rem; + height: 6.4rem; + font-size: 4.8rem; } + html .md-nav--primary .md-nav__title--site::before { + display: none; } + html [dir="rtl"] .md-nav--primary .md-nav__title::before { + right: 0.4rem; + left: initial; } + html [dir="rtl"] .md-nav--primary .md-nav__title--site .md-nav__button { + right: 0.4rem; + left: initial; } + .md-nav--primary .md-nav__list { + flex: 1; + overflow-y: auto; } + .md-nav--primary .md-nav__item { + padding: 0; + border-top: 0.1rem solid rgba(0, 0, 0, 0.07); } + [dir="rtl"] .md-nav--primary .md-nav__item { + padding: 0; } + .md-nav--primary .md-nav__item--nested > .md-nav__link { + padding-right: 4.8rem; } + [dir="rtl"] .md-nav--primary .md-nav__item--nested > .md-nav__link { + padding-right: 1.6rem; + padding-left: 4.8rem; } + .md-nav--primary .md-nav__item--nested > .md-nav__link::after { + content: "\E315"; } + [dir="rtl"] .md-nav--primary .md-nav__item--nested > .md-nav__link::after { + content: "\E314"; } + .md-nav--primary .md-nav__link { + position: relative; + margin-top: 0; + padding: 1.2rem 1.6rem; } + .md-nav--primary .md-nav__link::after { + position: absolute; + top: 50%; + right: 1.2rem; + margin-top: -1.2rem; + color: inherit; + font-size: 2.4rem; } + [dir="rtl"] .md-nav--primary .md-nav__link::after { + right: initial; + left: 1.2rem; } + .md-nav--primary .md-nav--secondary .md-nav__link { + position: static; } + .md-nav--primary .md-nav--secondary .md-nav { + position: static; + background-color: transparent; } + .md-nav--primary .md-nav--secondary .md-nav .md-nav__link { + padding-left: 2.8rem; } + [dir="rtl"] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link { + padding-right: 2.8rem; + padding-left: initial; } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link { + padding-left: 4rem; } + [dir="rtl"] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link { + padding-right: 4rem; + padding-left: initial; } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link { + padding-left: 5.2rem; } + [dir="rtl"] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link { + padding-right: 5.2rem; + padding-left: initial; } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link { + padding-left: 6.4rem; } + [dir="rtl"] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link { + padding-right: 6.4rem; + padding-left: initial; } + .md-nav__toggle ~ .md-nav { + display: flex; + -webkit-transform: translateX(100%); + transform: translateX(100%); + transition: opacity 0.125s 0.05s, -webkit-transform 0.25s cubic-bezier(0.8, 0, 0.6, 1); + transition: transform 0.25s cubic-bezier(0.8, 0, 0.6, 1), opacity 0.125s 0.05s; + transition: transform 0.25s cubic-bezier(0.8, 0, 0.6, 1), opacity 0.125s 0.05s, -webkit-transform 0.25s cubic-bezier(0.8, 0, 0.6, 1); + opacity: 0; } + [dir="rtl"] .md-nav__toggle ~ .md-nav { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); } + .no-csstransforms3d .md-nav__toggle ~ .md-nav { + display: none; } + .md-nav__toggle:checked ~ .md-nav { + -webkit-transform: translateX(0); + transform: translateX(0); + transition: opacity 0.125s 0.125s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.125s 0.125s; + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.125s 0.125s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + opacity: 1; } + .no-csstransforms3d .md-nav__toggle:checked ~ .md-nav { + display: flex; } + .md-sidebar--primary { + position: fixed; + top: 0; + left: -24.2rem; + width: 24.2rem; + height: 100%; + -webkit-transform: translateX(0); + transform: translateX(0); + transition: box-shadow 0.25s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.25s; + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.25s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + background-color: white; + z-index: 3; } + [dir="rtl"] .md-sidebar--primary { + right: -24.2rem; + left: initial; } + .no-csstransforms3d .md-sidebar--primary { + display: none; } + [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { + box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.4); + -webkit-transform: translateX(24.2rem); + transform: translateX(24.2rem); } + [dir="rtl"] [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { + -webkit-transform: translateX(-24.2rem); + transform: translateX(-24.2rem); } + .no-csstransforms3d [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { + display: block; } + .md-sidebar--primary .md-sidebar__scrollwrap { + overflow: hidden; } + .md-sidebar--primary .md-sidebar__scrollwrap { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: 0; } + .md-tabs { + display: none; } } + +@media only screen and (min-width: 60em) { + .md-content { + margin-right: 24.2rem; } + [dir="rtl"] .md-content { + margin-right: initial; + margin-left: 24.2rem; } + .md-header-nav__button.md-icon--search { + display: none; } + .md-header-nav__source { + display: block; + width: 23rem; + max-width: 23rem; + margin-left: 2.8rem; + padding-right: 1.2rem; } + [dir="rtl"] .md-header-nav__source { + margin-right: 2.8rem; + margin-left: initial; + padding-right: initial; + padding-left: 1.2rem; } + .md-search { + padding: 0.4rem; } + .md-search__overlay { + position: fixed; + top: 0; + left: 0; + width: 0; + height: 0; + transition: width 0s 0.25s, height 0s 0.25s, opacity 0.25s; + background-color: rgba(0, 0, 0, 0.54); + cursor: pointer; } + [dir="rtl"] .md-search__overlay { + right: 0; + left: initial; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__overlay { + width: 100%; + height: 100%; + transition: width 0s, height 0s, opacity 0.25s; + opacity: 1; } + .md-search__inner { + position: relative; + width: 23rem; + padding: 0.2rem 0; + float: right; + transition: width 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); } + [dir="rtl"] .md-search__inner { + float: left; } + .md-search__form { + border-radius: 0.2rem; } + .md-search__input { + width: 100%; + height: 3.6rem; + padding-left: 4.4rem; + transition: background-color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1), color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); + border-radius: 0.2rem; + background-color: rgba(0, 0, 0, 0.26); + color: inherit; + font-size: 1.6rem; } + [dir="rtl"] .md-search__input { + padding-right: 4.4rem; } + .md-search__input + .md-search__icon { + color: inherit; } + .md-search__input::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.7); } + .md-search__input:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.7); } + .md-search__input::-ms-input-placeholder { + color: rgba(255, 255, 255, 0.7); } + .md-search__input::placeholder { + color: rgba(255, 255, 255, 0.7); } + .md-search__input:hover { + background-color: rgba(255, 255, 255, 0.12); } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input { + border-radius: 0.2rem 0.2rem 0 0; + background-color: white; + color: rgba(0, 0, 0, 0.87); + text-overflow: none; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input + .md-search__icon, [data-md-toggle="search"]:checked ~ .md-header .md-search__input::-webkit-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input + .md-search__icon, [data-md-toggle="search"]:checked ~ .md-header .md-search__input:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input + .md-search__icon, [data-md-toggle="search"]:checked ~ .md-header .md-search__input::-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input + .md-search__icon, [data-md-toggle="search"]:checked ~ .md-header .md-search__input::placeholder { + color: rgba(0, 0, 0, 0.54); } + .md-search__output { + top: 3.8rem; + transition: opacity 0.4s; + opacity: 0; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__output { + box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.4); + opacity: 1; } + .md-search__scrollwrap { + max-height: 0; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__scrollwrap { + max-height: 75vh; } + .md-search__scrollwrap::-webkit-scrollbar { + width: 0.4rem; + height: 0.4rem; } + .md-search__scrollwrap::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.26); } + .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + .md-search-result__meta { + padding-left: 4.4rem; } + [dir="rtl"] .md-search-result__meta { + padding-right: 4.4rem; + padding-left: initial; } + .md-search-result__article { + padding-left: 4.4rem; } + [dir="rtl"] .md-search-result__article { + padding-right: 4.4rem; + padding-left: 1.6rem; } + .md-sidebar--secondary { + display: block; + margin-left: 100%; + -webkit-transform: translate(-100%, 0); + transform: translate(-100%, 0); } + [dir="rtl"] .md-sidebar--secondary { + margin-right: 100%; + margin-left: initial; + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0); } } + +@media only screen and (min-width: 76.25em) { + .md-content { + margin-left: 24.2rem; } + [dir="rtl"] .md-content { + margin-right: 24.2rem; } + .md-content__inner { + margin-right: 2.4rem; + margin-left: 2.4rem; } + .md-header-nav__button.md-icon--menu { + display: none; } + .md-nav[data-md-state="animate"] { + transition: max-height 0.25s cubic-bezier(0.86, 0, 0.07, 1); } + .md-nav__toggle ~ .md-nav { + max-height: 0; + overflow: hidden; } + .no-js .md-nav__toggle ~ .md-nav { + display: none; } + .md-nav__toggle:checked ~ .md-nav, .md-nav[data-md-state="expand"] { + max-height: 100%; } + .no-js .md-nav__toggle:checked ~ .md-nav, .no-js .md-nav[data-md-state="expand"] { + display: block; } + .md-nav__item--nested > .md-nav > .md-nav__title { + display: none; } + .md-nav__item--nested > .md-nav__link::after { + display: inline-block; + -webkit-transform-origin: 0.45em 0.45em; + transform-origin: 0.45em 0.45em; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + vertical-align: -0.125em; } + .js .md-nav__item--nested > .md-nav__link::after { + transition: -webkit-transform 0.4s; + transition: transform 0.4s; + transition: transform 0.4s, -webkit-transform 0.4s; } + .md-nav__item--nested .md-nav__toggle:checked ~ .md-nav__link::after { + -webkit-transform: rotateX(180deg); + transform: rotateX(180deg); } + [data-md-toggle="search"]:checked ~ .md-header .md-search__inner { + width: 68.8rem; } + .md-search__scrollwrap { + width: 68.8rem; } + .md-sidebar--secondary { + margin-left: 122rem; } + [dir="rtl"] .md-sidebar--secondary { + margin-right: 122rem; + margin-left: initial; } + .md-tabs ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item--nested { + font-size: 0; + visibility: hidden; } + .md-tabs--active ~ .md-main .md-nav--primary .md-nav__title { + display: block; + padding: 0; } + .md-tabs--active ~ .md-main .md-nav--primary .md-nav__title--site { + display: none; } + .no-js .md-tabs--active ~ .md-main .md-nav--primary .md-nav { + display: block; } + .md-tabs--active ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item { + font-size: 0; + visibility: hidden; } + .md-tabs--active ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item--nested { + display: none; + font-size: 1.4rem; + overflow: auto; + visibility: visible; } + .md-tabs--active ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item--nested > .md-nav__link { + display: none; } + .md-tabs--active ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item--active { + display: block; } + .md-tabs--active ~ .md-main .md-nav[data-md-level="1"] { + max-height: initial; + overflow: visible; } + .md-tabs--active ~ .md-main .md-nav[data-md-level="1"] > .md-nav__list > .md-nav__item { + padding-left: 0; } + .md-tabs--active ~ .md-main .md-nav[data-md-level="1"] .md-nav .md-nav__title { + display: none; } } + +@media only screen and (min-width: 45em) { + .md-footer-nav__link { + width: 50%; } + .md-footer-copyright { + max-width: 75%; + float: left; } + [dir="rtl"] .md-footer-copyright { + float: right; } + .md-footer-social { + padding: 1.2rem 0; + float: right; } + [dir="rtl"] .md-footer-social { + float: left; } } + +@media only screen and (max-width: 29.9375em) { + [data-md-toggle="search"]:checked ~ .md-header .md-search__overlay { + -webkit-transform: scale(45); + transform: scale(45); } } + +@media only screen and (min-width: 30em) and (max-width: 44.9375em) { + [data-md-toggle="search"]:checked ~ .md-header .md-search__overlay { + -webkit-transform: scale(60); + transform: scale(60); } } + +@media only screen and (min-width: 45em) and (max-width: 59.9375em) { + [data-md-toggle="search"]:checked ~ .md-header .md-search__overlay { + -webkit-transform: scale(75); + transform: scale(75); } } + +@media only screen and (min-width: 60em) and (max-width: 76.1875em) { + [data-md-toggle="search"]:checked ~ .md-header .md-search__inner { + width: 46.8rem; } + .md-search__scrollwrap { + width: 46.8rem; } + .md-search-result__teaser { + max-height: 5rem; + -webkit-line-clamp: 3; } } + +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJhc3NldHMvc3R5bGVzaGVldHMvYXBwbGljYXRpb24uNDUxZjgwZTUuY3NzIiwic291cmNlUm9vdCI6IiJ9*/ \ No newline at end of file diff --git a/assets/stylesheets/paradox-material-theme.css b/assets/stylesheets/paradox-material-theme.css new file mode 100644 index 0000000000..4d014788eb --- /dev/null +++ b/assets/stylesheets/paradox-material-theme.css @@ -0,0 +1,89 @@ +/*! + Paradox Material Theme + Copyright (c) 2017-2018 Jonas Fonseca + License: MIT +*/ + +.callout { + visibility: hidden; +} + +.md-nav--primary > .md-nav--secondary { + display: none; +} + +.md-nav--primary .md-version { + padding: 1.2rem 1.2rem 0rem; +} + +.md-nav--primary .md-version label { + cursor: default; +} + +.md-version .md-icon { + position: relative; + top: .2rem; + left: 0; +} + +@media only screen and (max-width: 76.1875em) { + .md-nav--primary .md-version { + padding: 0; + } +} + +.md-nav--secondary { + visibility: hidden; +} + +dl.mdc-tab-bar { + margin-left: 0; +} + +.mdc-tab-content { + display: none; +} + +.mdc-tab-content--active { + display: block; +} + +.md-source__icon i { + font-size: 24px; + margin-top: 1.2rem; + margin-left: 1.2rem; +} + +.md-edit:before { + content: "\E3C9"; +} + +pre.prettyprint { + border: none; +} + +.callout.no-title .callout-title { + display: none; +} + +.callout.no-title > :nth-child(2) { + margin-top: 0; +} + +.print-only { + display: none; +} + +@media print { + .print-only { + display: block; + } + + .md-edit, h1 a.anchor { + display: none; + } + + .md-version:before { + content: "\E893"; + } +} diff --git a/assets/tmt_favicon.ico b/assets/tmt_favicon.ico new file mode 100644 index 0000000000..eaaaf710b2 Binary files /dev/null and b/assets/tmt_favicon.ico differ diff --git a/icd-db/icd-db.html b/icd-db/icd-db.html new file mode 100644 index 0000000000..0e64bf8454 --- /dev/null +++ b/icd-db/icd-db.html @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + +Using the icd-db command line app · Interface Database System (IDBS) + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ + +
+
+
+

Using the icd-db command line app

+

The icd-db program can be used to validate and ingest model files into the database. In order to use the icd-db program, the MongoDB server must be running (see Installing MongoDB). Most of what icd-db command provides can also be done using the web interface, so it’s possible to skip this step.

+

+

The figure above shows the usage of the icd-db program. Its primary purpose is to validate and ingest model files into the ICD Model File Database. If any of the model files under the given directory don’t pass validation, then nothing is changed in the database. Error messages indicate where the validation errors occurred, including a file name and a position in JSONPath format.

+

Below you see the options for the icd-db command, which are listed with the –help option. Some of the options are basic querying of the database, to see what subsystems and components are currently in the local database, and information about them, such as data rates and units used. This can be useful when developing and browsing APIs without bringing up the full system.

+
icd-db 3.0.0
+Usage: icd-db [options]
+
+  --db <name>              The name of the database to use (default: icds4)
+  -h, --host <hostname>    The host name where the database is running (default: localhost)
+  -p, --port <number>      The port number to use for the database (default: 27017)
+  -i, --ingest <dir>       Top level directory containing files to ingest into the database
+  -l, --list [subsystems|assemblies|hcds|all]
+                           Prints a list of ICD subsystems, assemblies, HCDs or all components
+  --listData <subsystem>   Prints a list of event sizes and yearly accumulation of archived data for 
+			   components of the specified subsystem.
+  -u, --allUnits           Prints the set of unique units used in all received commands and published events 
+			   for all components in DB.
+  -c, --component <name>   Specifies the component to be used by any following options 
+			   (subsystem must also be specified)
+  -s, --subsystem <subsystem>[:version]
+                           Specifies the subsystem (and optional version) to be used by any following options
+  -t, --subsystem2 <subsystem>[:version]
+                           Specifies the second subsystem (and optional version) in an ICD to be used by 
+			   any following options
+  --component2 <name>      Specifies the subsytem2 component to be used by any following options 
+			   (subsystem2 must also be specified)
+  --icdversion <icd-version>
+                           Specifies the version to be used by any following options (overrides subsystem 
+			   and subsystem2 versions)
+  -o, --out <outputFile>   Saves the selected API (or ICD) to the given file in a format based on the file's
+ 			   suffix (html, pdf) or generates code for the given API in a language based on the
+ 			   suffix ('scala', 'java', 'ts' (typescript), py (python))
+  --drop [db|subsystem|component]
+                           Drops the specified component, subsystem, or the entire icd database 
+			   (requires restart of icd web app)
+  --versions <subsystem>   List the version history of the given subsystem
+  --diff <subsystem>:<version1>[,version2]
+                           For the given subsystem, list the differences between <version1> and <version2> 
+			   (or the current version)
+  -m, --missing <outputFile>
+                           Generates a 'Missing Items' report to the given file (dir for csv) in a format 
+			   based on the file's suffix (html, pdf, otherwise text/csv formatted files are
+ 			   generated in given dir)
+  -a, --archived <outputFile>
+                           Generates an 'Archived Items' report for all subsystems (or the given one) to the
+ 			   given file in a format based on the file's suffix (html, pdf, csv)
+  --allSubsystems          Include all subsystems in searches for publishers, subscribers, etc. while 
+			   generating API doc (Default: only consider the one subsystem)
+  --clientApi              Include subscribed events and sent commands in the API dic (Default: only include
+			   published events and received commands)
+  --orientation [portrait|landscape]
+                           For PDF output: The page orientation (default: landscape)
+  --fontSize <size>        For PDF or HTML file output: The base font size in px for body text (default: 10)
+  --lineHeight <height>    For PDF or HTML file output: The line height (default: 1.6)
+  --paperSize [Letter|Legal|A4|A3]
+                           For PDF output: The paper size (default: Letter)
+  --documentNumber text    For PDF output: An optional document number to display after the title/subtitle
+  --package package.name   Package name for generated Scala files (default: no package)
+  --help
+  --version
+
+

Some example commands are shown below.

+

To ingest the directory of model files created in the last section use the -i or --ingest option:

+
icd-db --ingest directoryName
+
+

The –l or --list option with a value of subsystems, assemblies, HCDs, or all will list the components in the database that meet the criteria:

+
$ icd-db –list all
+
+

To list just assemblies:

+
$ icd-db –list assemblies
+
+

List only HCDs:

+
$ icd-db –list hcds
+
+

List the existing subsystems in the local database:

+
$ icd-db –list subsystems
+
+

Several other commands are available and are not documented here.

+

Generating Documents and Code from the ICD Database

+

The icd-db –o option can be used to output a file in a format based on the file’s suffix (.pdf and .html are supported for generating documentation and .scala, .java, .py (python) and .ts (typescript) are supported for generating code containing the event, command and parameter keys for the given subsystem and/or component:

+
$ icd-db –s TCS -o TcsApi.pdf    // Generate a PDF for TCS
+$ icd-db –s TCS -o TcsApi.scala  // Generate Scala code for TCS
+$ icd-db –s TCS -o TcsApi.java   // Generate Java code for TCS
+$ icd-db –s TCS -o TcsApi.py     // Generate Python code for TCS
+$ icd-db –s TCS -o TcsApi.ts     // Generate Typescript code for TCS
+
+

You can also generate documentation and code for a specific component of a subsystem and specify the package name (required for Java):

+
$ icd-db –s IRIS -c ifs.scale -o IrisApi.pdf                     // Generate a PDF for IRIS.ifs.scale
+$ icd-db –s IRIS -c ifs.scale –package iris.api -o IrisApi.scala // Generate Scala code for IRIS.ifs.scale
+$ icd-db –s IRIS -c ifs.scale –package iris.api -o IrisApi.java  // Generate Java code for IRIS.ifs.scale
+$ icd-db –s IRIS -c ifs.scale -o IrisApi.py                      // Generate Python code for IRIS.ifs.scale
+$ icd-db –s IRIS -c ifs.scale -o IrisApi.ts                      // Generate Typescript code for IRIS.ifs.scale
+
+

The generated code always contains a top level object (scala), class (java, python) or namespace (typescript) with the base name of the file. Then there are nested objects for each component, and in each component, nested objects for each event and command, containing constants for all the event keys, command names and parameter keys.

Note
+

After generating the code, icd-db attempts to format it using a command line formatter application in your shell path. It uses scalafmt for Scala, prettier for TypeScript, black for Python and google-java-format for Java. If it doesn’t find those it will print a message, but still generate the file. You can install scalafmt and google-java-format with cs (coursier), black with pip (pip3), and prettier with npm.

+

You can also generate code using the web interface, as described later.

+
+ + +
+
+
+
+ + +
+ + + + + + + + diff --git a/icd-fits/icd-fits.html b/icd-fits/icd-fits.html new file mode 100644 index 0000000000..07ccce6733 --- /dev/null +++ b/icd-fits/icd-fits.html @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + +Using the icd-fits command line app · Interface Database System (IDBS) + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ + +
+
+
+

Using the icd-fits command line app

+

The icd-fits command line application can be used to view and update the FITS Dictionary and related files or to generate a PDF or other type of file displaying the FITS keywords for a given subsystem or component.

+

In normal operations, the FITS Dictionary is loaded automatically from the published DMS-Model-Files GitHub repository. At the time of writing this has not yet been published.

+

Below are the available options for the icd-fits program, which you can list with the icd-fits --help option:

+
icd-fits 3.0.0
+Usage: icd-fits [options]
+
+  -d, --db <name>          The name of the database to use (for the --ingest option, default: icds4)
+  --host <hostname>        The host name where the database is running (for the --ingest option, default: localhost)
+  --port <number>          The port number to use for the database (for the --ingest option, default: 27017)
+  -c, --component <name>   Specifies the component to be used by any following options (subsystem must also be specified)
+  -s, --subsystem <subsystem>[:version]
+                           Specifies the subsystem (and optional version) to be used by any following options
+  -t, --tag <tag>          Filters the list of FITS keywords to those with the given tag
+  -l, --list               Prints the list of known FITS keywords
+  --validate <file>        Validates a JSON formatted file containing the FITS Keyword dictionary and prints out any errors
+  -g, --generate <file>    Generates an updated FITS dictionary JSON file by merging the one currently in the
+                        icd database with the FITS keyword information defined for event parameters in the
+ 				    publish model files. If a subsystem is specified (with optional version), the
+ 				    merging is limited to that subsystem.
+  -i, --ingest <file>      Ingest a JSON formatted file containing a FITS Keyword dictionary into the icd database
+  --ingestTags <file>      Ingest a JSON or HOCON formatted file defining tags for the FITS dictionary into the icd database
+  --ingestChannels <file>  Ingest a JSON or HOCON formatted file defining the available FITS channels for each subsystem into the icd database
+  -o, --out <outputFile>   Generates a document containing a table of FITS keyword information in a format 
+			   based on the file's suffix (html, pdf, json, csv, conf (HOCON))
+  --orientation [portrait|landscape]
+                           For PDF output: The page orientation (default: landscape)
+  --fontSize <size>        For PDF or HTML file output: The base font size in px for body text (default: 10)
+  --lineHeight <height>    For PDF or HTML file output: The line height (default: 1.6)
+  --paperSize [Letter|Legal|A4|A3]
+                           For PDF output: The paper size (default: Letter)
+  --help
+  --version
+ --version
+
+

FITS Keywords

+

The generated subsystem APIs contain infomation about FITS keywords whose values come from event parameters. That is, an event’s parameter value is the source of the FITS keyword’s value.

+

FITS keyword data is stored in three files under DMS-Model-Files on GitHub. Once DMS is published, the file should be automatically loaded by the icdwebserver or icd-git --ingest commands. Until then, the FITS keywords, channels and tags can be manually loaded into the icd database once by running (from the icd source directory):

+
icd-fits -i examples/3.0/FITS-Dictionary.json --ingestChannels examples/3.0/FITS-Channels.conf --ingestTags examples/3.0/FITS-Tags.conf
+
+

Alternatively you can check out and manually ingest DMS-Model-Files into the local icd database by using the Upload feature in the icd web app or with the command line:

+
icd-db -i DMS-Model-Files
+
+

The contents of the files are as follows: * * FITS-Dictionary.json - This is the FITS dictionary and contains an entry for each FITS keyword, mapping it to source event parameters. If a keyword has multiple sources, named channels are used, each containing one source. * FITS-Channels.conf - This defines which channels are available for each subsystem (Channels are used when a FITS keyword has multiple source event parameters). * FITS-Tags.conf - Assigns tags to FITS keywords, which can be used in the web app to filter and display the FITS keyword information.

+

Besides the three above files, FITS keyword information can be defined in the publish-model.conf files for each subsystem component. Event parameters can define the associated keyword as follows:

+
keyword = IMGDISWV
+
+

If the keyword has multiple source parameters, you can specify the channel:

+
keyword = IMGDISWV
+channel = ATM
+
+

In some more complicated cases, you can also specify multiple keywords whose values are taken from an index (or rowIndex for matrix/2d arrays) in the parameter’s array values:

+
keywords: [
+     {
+       keyword = OIWFS1PS
+       rowIndex = 0
+     }
+     {
+       keyword = OIWFS2PS
+       rowIndex = 1
+     }
+     {
+       keyword = OIWFS3PS
+       rowIndex = 2
+     }
+]
+
+

The FITS keyword definitions in a subsystem’s model files can be used to generate a new FITS dictionary by merging the existing FITS dictionary with the definitions in the publish model files. In this case the information from the published events overrides the information in the existing FITS dictionary:

+
icd-fits --subsystem IRIS --generate FITS-Dictionary.json
+
+

Or using the short form options and with a subsystem version:

+
icd-fits -s IRIS:1.7 -g FITS-Dictionary.json
+
+

The generated FITS dictionary JSON file can then be copied to the DMS-Model-Files repository and published, so that it will be automatically used by the icd web app and command line apps (Note that Publishing DMS-Model-files requires special permission).

+

You can also manually load the new FITS dictionary into your local icd database using the command line:

+
icd-fits -i FITS-Dictionary.json
+
+

Generating a Document listing the FITS Keywords

+

You can use icd-fits to print a list of keywords coming from a subsystem or component to stdout. For example, the following command lists the keywords for IRIS:

+
icd-fits --subsystem IRIS --list
+
+

Or you can use the short form options and restrict the output to a component:

+
icd-fits -s IRIS -c pupilview -l
+
+

You can create a PDF of the IRIS FITS keywords like this:

+
icd-fits -s IRIS -o IRIS-Keywords.pdf
+
+

The format of the output file depends on the suffix. You can also generate csv, html, json and conf (HCON) formatted files with the same information.

+
+ + +
+
+
+
+ + +
+ + + + + + + + diff --git a/idbs/introduction.html b/idbs/introduction.html new file mode 100644 index 0000000000..2bcf3881d8 --- /dev/null +++ b/idbs/introduction.html @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + +Introduction · Interface Database System (IDBS) + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ +
+
+
+ + +
+
+
+
+
+
+

Introduction

+

The Interface Database System (IDBS) was created to help component builders and system engineering understand the programming interfaces of software components created with the TIO Common Software.

+

Background

+

The project was started for the following purposes:

+
    +
  1. To document the interfaces of components based on TIO Common Software in the TIO Software System.
  2. +
  3. To support a more agile development process by tracking changes to component interfaces over the course of TMT construction.
  4. +
  5. To understand how events are used in the software system.
  6. +
  7. To support the Systems Engineering change control process by understanding how planned interface changes influence the software system.
  8. +
  9. To understand the software interfaces between subsystems and components in the software system.
  10. +
  11. To decrease the workload of developers by generating API and ICD documentation that can be used for reviews.
  12. +
  13. Provide a platform for understanding and modeling the interactions of components during observing. This might include adding additional information to the models.
  14. +
+

Design Background

+

There might be several ways to solve the problems IDBS is addressing. One approach might be to use/extend a source code documentation markup tool such as Doxygen or the 15+ other products a Google search on software documentation shows. The reason this approach wasn’t taken is that the problem is not about documenting source code, it is modeling components and interfaces and delivering a database that provides a basis for understanding and tracking interfaces and their changes. The models need to drive the source, not the other way around. Documentation tools can generate documents but extracting information and putting it into a database is not the scope of these tools. The primary need is to have a database of interfaces and delivering interface documentation is a second, although important, side effect. Ultimately, it is a question of how to best describe a component and its interfaces.

+
+ + +
+
+
+
+ + +
+ + + + + + + + diff --git a/idbs/overview.html b/idbs/overview.html new file mode 100644 index 0000000000..df4ce19d7f --- /dev/null +++ b/idbs/overview.html @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + + + + + +Overview · Interface Database System (IDBS) + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ +
+
+
+ + +
+
+
+
+
+
+

Overview

+

The IDBS software currently consists of the following programs:

+
    +
  • icd-db
  • +
  • icd-git
  • +
  • icd-viz
  • +
  • icd-fits
  • +
  • icdwebserver
  • +
+

The components of the Interface Database System are shown below. They are briefly described here, with more details provided in subsequent sections.

+

The workflow proceeds from left to right.

+

+

The TIO developer, using Common Software for his/her components, creates component model files. These files are validated and ingested into the ICD Model File Database using either the icd-db command or a web application called icdwebserver. These were developed to work with the ICD Model File Database and provide the functionality the users of the system need. The model files are stored and published in Git repositories on GitHub. The icd-git application can be used to sync the local database with the published versions on GitHub. The icd web app also gets its information from the published versions on GitHub, in addition to any unpublished versions that a developer is working with locally. The icd-viz command line application can be used to generate a graph of component or subsystem relationships. This feature requires that graphviz is installed and is also available in the icd web app. The icd-fits command can be used to view information about FITS keywords and their source events.

+

icd-db

+

The icd-db program exists to validate and ingest model files into a local ICD Model File Database. When creating or modifying the models, this feature can be used to incorporate working versions of the files into the database system. The icd-db program also allows some informative queries to be performed directly on the database, showing what subsystem and components exist in the database, and information about them such as data rates, data types, and units used. Note that these operations only work on the models that exist in the local version of the database, and do not access the released models on the GitHub repository.

+

icdwebserver

+

The icdwebserver web application provides the IDBS user application interface. The browser-based user interface allows the ingesting of model files, publishing them, and displaying versioned APIs for each component. An API is defined as all the functionality of a component or subsystem including inputs and outputs. An ICD is produced by taking the intersection of two subsystem API documents.

+

The IDBS browser provides the ability to browse the APIs for both published and unpublished models. The published APIs are constructed from models obtained from the git repository which stores the released versions, and the unpublished APIs are constructed by accessing the models stored in the local database that have been ingested using the icd-db program or the web app.

+

The current version of the IDBS browser user interface includes the following features:

+
    +
  • Allows browsing all the subsystems and their components (including previously published versions as well as unpublished working versions).
  • +
  • View the API for a subsystem or an individual component.
  • +
  • Browse interfaces between subsystems, or components within subsystems.
  • +
  • Upload directories containing the model files for a subsystem API
  • +
  • Publish APIs and ICDs (if enabled, for TIO SE use only)
  • +
  • Print ICD or API information from the browser (using browser print).
  • +
  • Export an API or ICD as a PDF document.
  • +
  • Show the publish history of an API or ICD and compare the differences between versions
  • +
  • Generate a PDF document that shows the amount of storage required for all archived events
  • +
  • Generate a graph of component or subsystem relationships
  • +
+

A public (password-protected) ICD web service has been set up that allows users to view the APIs and ICDs of all TIO subsystems and components. The uploading functionality of this web service has been disabled; new model files must be committed to the GitHub repository to add new versions to this system, which are automatically added to the web service whenever the system is refreshed. Log-in credentials can be obtained from Systems Engineering. This web service is located at: https://sdb.tmt.org/.

+

icd-git

+

The icd-git application is a command line tool that can be used to update your local icd database with the published versions from GitHub (Use: icd-git --ingest). Otherwise, this application is primarily meant to be used by systems engineering to manage official releases of APIs and ICDs by interacting directly with versions of subsystem model files as maintained by the official GitHub repository (http://github.com/tmt-icd). Since this tool is mainly intended to be used by the Systems Engineering group, it is not documented here.

+

It is also possible to publish APIs and ICDs using the web app (icdwebserver) and this is now the preferred way to do it. The API publishing features of the web app are protected by password and only enabled for use by those with permission to push to the GitHub repository that holds that information.

+

icd-viz

+

The icd-viz command line application generates a graph of the relationships of given components or subsystems. There are a number of options for controlling what is displayed and the format of the image produced.

+

This application relies on graphviz to generate the graph from a description generated in the dot graph description language. Run icd-viz –help to see the command line options (These are also listed in the README.md file for the icd-viz subproject on GitHub). Note that the icd web app also provides a user interface for most of these features. See Using the Web Interface for more information on that.

+

The icd-viz command lets you specify one or more TIO components or subsystems (in which case all components in the subsystem are used). These are the primary nodes of the graph, drawn as solid ovals. Then, all of the components that publish events for these components or subscribe to events from these components are added to the graph (as dashed ovals). The graph edges indicate the flow of events and commands between the components and optionally show any errors, such as events subscribed from publishers that do not exist, or published events with no subscribers.

+

The default colors used for the graph can be found in icd/icd-viz/src/main/resources/reference.conf and can also be overridden with a command line option like -Dicd.viz.color.IRIS=darkgreen (replace IRIS with the subsystem). The colors should be valid Graphviz colors.

Note
+

The design of the icd-viz application is based on previous work (NIC/scripts/icdRelationships.py) from Ed Chapin of the NRC.

+

Example icd-viz command line usage:

+

Plot all interfaces for a particular component to the screen, label events and commands, and show missing events and commands:

+
icd-viz --components iris.oiwfs.poa --missingcommands true --missingevents true --commandlabels true --eventlabels true
+
+

Below is the resulting image from the above command:

+

+

icd-fits

+

The icd-fits command line application can be used to manually ingest FITS dictionary files into the icd database and produce tables in PDF and other format containing information about all the FITS keywords and the subsystem events that are the source of the keyword values. There are command line options that allow you to filter the list of keywords by source subsystem and component as well as by tag.

+

The command can also be used to merge the FITS keyword definitions found in the publish model files with the current FITS dictionary stored in the icd database to produce a new FITS dictionary, where the keyword definitions in the publish model files override the ones previously in the FITS dictionary. This can be used to update the FITS-Dictionary.json file in the tmt-icd DMS-Model-Files GitHub repository, which is loaded automatically whenever the DMS model files are ingested into the icd database.

+

The main source for the FITS dictionary files is in the FITS-Dictionary directory in the tmt-icd DMS-Model-Files GitHub repository. One file there, FITS-Dictionary.json, lists information about the FITS keywords and related subsystem, component, event, and parameter. Another file, FITS-Channels.conf, lists the available channel names for FITS keywords that have multiple source events or parameters. The third file, FITS-Tags.conf, assigns tags to the keywords, such as SL (Seeing-Limited), DL (Diffraction-Limited), or the WFOS, IRIS or MODHIS instruments.

+

Some keywords can come from multiple sources or channels, such as imaging or IFS. This information is also included in the FITS Dictionary JSON file above. When you specify the FITS keyword in an event’s parameter description in publish-model.conf, in most cases it is enough to just list the keyword name with keyword = keyname. If the same FITS keyword has multiple different source events/parameters, it needs to be assigned a channel as well. For example: channel = IFS. The channel name needs to be one of the predefined names for that subsystem listed in FITS-Channels.conf.

+

For more details, see Using the icd-fits command line app.

+

Note that at the time of writing these files are still in development and may contain incorrect information.

+

Implementation Details

+

The IDBS is implemented in Scala, a JVM-based language (http://www.scala-lang.org). The web application is developed using Play (https://www.playframework.com). These are tools selected for OSW and CSW. The ICD information is stored in a document database called MongoDB (https://www.mongodb.org).

+

The code is available on GitHub at: https://github.com/tmtsoftware/icd.

+
+ + +
+
+
+
+ + +
+ + + + + + + + diff --git a/images/icd-db/icd-db.png b/images/icd-db/icd-db.png new file mode 100644 index 0000000000..f49caf91b7 Binary files /dev/null and b/images/icd-db/icd-db.png differ diff --git a/images/installing/fig2.jpg b/images/installing/fig2.jpg new file mode 100644 index 0000000000..bec38a5411 Binary files /dev/null and b/images/installing/fig2.jpg differ diff --git a/images/modelFiles/alarmExample1.png b/images/modelFiles/alarmExample1.png new file mode 100644 index 0000000000..f17ecd64bc Binary files /dev/null and b/images/modelFiles/alarmExample1.png differ diff --git a/images/modelFiles/commandReceive1.png b/images/modelFiles/commandReceive1.png new file mode 100644 index 0000000000..a6c050c1ba Binary files /dev/null and b/images/modelFiles/commandReceive1.png differ diff --git a/images/modelFiles/commandsSent1.png b/images/modelFiles/commandsSent1.png new file mode 100644 index 0000000000..12a80ec7f6 Binary files /dev/null and b/images/modelFiles/commandsSent1.png differ diff --git a/images/modelFiles/currentStateExample1.png b/images/modelFiles/currentStateExample1.png new file mode 100644 index 0000000000..34cb3d1614 Binary files /dev/null and b/images/modelFiles/currentStateExample1.png differ diff --git a/images/modelFiles/exampleLaTeXMath.png b/images/modelFiles/exampleLaTeXMath.png new file mode 100644 index 0000000000..77ab1cb08a Binary files /dev/null and b/images/modelFiles/exampleLaTeXMath.png differ diff --git a/images/modelFiles/html-math.png b/images/modelFiles/html-math.png new file mode 100644 index 0000000000..b5da5e133c Binary files /dev/null and b/images/modelFiles/html-math.png differ diff --git a/images/modelFiles/seg-service.png b/images/modelFiles/seg-service.png new file mode 100644 index 0000000000..75e6c682a0 Binary files /dev/null and b/images/modelFiles/seg-service.png differ diff --git a/images/modelFiles/subscribeModel1.png b/images/modelFiles/subscribeModel1.png new file mode 100644 index 0000000000..35cff0675b Binary files /dev/null and b/images/modelFiles/subscribeModel1.png differ diff --git a/images/modelFiles/tcsEvent1.png b/images/modelFiles/tcsEvent1.png new file mode 100644 index 0000000000..0b3dd32812 Binary files /dev/null and b/images/modelFiles/tcsEvent1.png differ diff --git a/images/modelFiles/tcsPk.png b/images/modelFiles/tcsPk.png new file mode 100644 index 0000000000..e184af2230 Binary files /dev/null and b/images/modelFiles/tcsPk.png differ diff --git a/images/modelFiles/umlBlock.png b/images/modelFiles/umlBlock.png new file mode 100644 index 0000000000..36fc07b107 Binary files /dev/null and b/images/modelFiles/umlBlock.png differ diff --git a/images/overview/fig1.jpg b/images/overview/fig1.jpg new file mode 100644 index 0000000000..1e8564e9c7 Binary files /dev/null and b/images/overview/fig1.jpg differ diff --git a/images/overview/icd-viz.png b/images/overview/icd-viz.png new file mode 100644 index 0000000000..239d294f69 Binary files /dev/null and b/images/overview/icd-viz.png differ diff --git a/images/webapp/IRIS-graph-no-errors.png b/images/webapp/IRIS-graph-no-errors.png new file mode 100644 index 0000000000..55d790b894 Binary files /dev/null and b/images/webapp/IRIS-graph-no-errors.png differ diff --git a/images/webapp/apsApi.png b/images/webapp/apsApi.png new file mode 100644 index 0000000000..f2658e03e6 Binary files /dev/null and b/images/webapp/apsApi.png differ diff --git a/images/webapp/fileTree.png b/images/webapp/fileTree.png new file mode 100644 index 0000000000..0fe210852a Binary files /dev/null and b/images/webapp/fileTree.png differ diff --git a/images/webapp/generateButton.png b/images/webapp/generateButton.png new file mode 100644 index 0000000000..d45181f856 Binary files /dev/null and b/images/webapp/generateButton.png differ diff --git a/images/webapp/glc-commands-received.png b/images/webapp/glc-commands-received.png new file mode 100644 index 0000000000..ef48290c20 Binary files /dev/null and b/images/webapp/glc-commands-received.png differ diff --git a/images/webapp/glc-events-published.png b/images/webapp/glc-events-published.png new file mode 100644 index 0000000000..68e7b8aecb Binary files /dev/null and b/images/webapp/glc-events-published.png differ diff --git a/images/webapp/graph-pdf-options.png b/images/webapp/graph-pdf-options.png new file mode 100644 index 0000000000..f1519452e2 Binary files /dev/null and b/images/webapp/graph-pdf-options.png differ diff --git a/images/webapp/graph-select-iris.png b/images/webapp/graph-select-iris.png new file mode 100644 index 0000000000..c20a4f8037 Binary files /dev/null and b/images/webapp/graph-select-iris.png differ diff --git a/images/webapp/graph.png b/images/webapp/graph.png new file mode 100644 index 0000000000..637be7757f Binary files /dev/null and b/images/webapp/graph.png differ diff --git a/images/webapp/history.png b/images/webapp/history.png new file mode 100644 index 0000000000..37dbad3b61 Binary files /dev/null and b/images/webapp/history.png differ diff --git a/images/webapp/icd-hist.png b/images/webapp/icd-hist.png new file mode 100644 index 0000000000..c7cf21a8a7 Binary files /dev/null and b/images/webapp/icd-hist.png differ diff --git a/images/webapp/icd-m1cs-tcs.png b/images/webapp/icd-m1cs-tcs.png new file mode 100644 index 0000000000..44b8c4ed65 Binary files /dev/null and b/images/webapp/icd-m1cs-tcs.png differ diff --git a/images/webapp/legend.png b/images/webapp/legend.png new file mode 100644 index 0000000000..cbf003c964 Binary files /dev/null and b/images/webapp/legend.png differ diff --git a/images/webapp/missingButton.png b/images/webapp/missingButton.png new file mode 100644 index 0000000000..cea8e4f71f Binary files /dev/null and b/images/webapp/missingButton.png differ diff --git a/images/webapp/missingReport.png b/images/webapp/missingReport.png new file mode 100644 index 0000000000..198bc801f4 Binary files /dev/null and b/images/webapp/missingReport.png differ diff --git a/images/webapp/select-tcs-m1cs-icd.png b/images/webapp/select-tcs-m1cs-icd.png new file mode 100644 index 0000000000..8df2f73079 Binary files /dev/null and b/images/webapp/select-tcs-m1cs-icd.png differ diff --git a/images/webapp/tcs-m1cs-icd.png b/images/webapp/tcs-m1cs-icd.png new file mode 100644 index 0000000000..2dfdc6b2bc Binary files /dev/null and b/images/webapp/tcs-m1cs-icd.png differ diff --git a/images/webapp/tcsSelectVersion.png b/images/webapp/tcsSelectVersion.png new file mode 100644 index 0000000000..2c347bbbd6 Binary files /dev/null and b/images/webapp/tcsSelectVersion.png differ diff --git a/images/webapp/uploadFiles.png b/images/webapp/uploadFiles.png new file mode 100644 index 0000000000..c3b21cb064 Binary files /dev/null and b/images/webapp/uploadFiles.png differ diff --git a/images/webapp/uploadFiles2.png b/images/webapp/uploadFiles2.png new file mode 100644 index 0000000000..a886722bc5 Binary files /dev/null and b/images/webapp/uploadFiles2.png differ diff --git a/images/webapp/uploadFiles3.png b/images/webapp/uploadFiles3.png new file mode 100644 index 0000000000..a87a618b07 Binary files /dev/null and b/images/webapp/uploadFiles3.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000000..944b8c251f --- /dev/null +++ b/index.html @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + +Interface Database System (IDBS) + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ + +
+
+ + +
+ + + + + + + + diff --git a/installing/installing.html b/installing/installing.html new file mode 100644 index 0000000000..31bc4b9dc1 --- /dev/null +++ b/installing/installing.html @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + +Installing IDBS · Interface Database System (IDBS) + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ + +
+
+
+

Installing IDBS

+

While the public ICD web service can be useful for browsing existing APIs, it can be easier to develop model files by using the IDBS system locally. The icd-db and icdwebserver programs are useful for the developer in order to validate and ingest model files into the local ICD database. The ICD software can be installed on any machine with a Java JDK version of 17 or greater. The details of installing Java on a system are not covered here (Java 17 was used for testing).

+

The following external applications are also required at runtime: * graphviz – The dot command is required to generate graphs and for inline UML support. * swagger-codegen – Required for documenting HTTP services (at least version 3.0.36, install with cs install --contrib swagger-codegen) * mongodb – Required for the database that stores the API information (see below) * jsonnet - Required to process model files written in the jsonnet language

+

The following applications are optional and used if present to fomat generated source code: * scalafmt - Used to format generated Scala source files (Install with cs install scalafmt) * google-java-format - Used to format generated Java source files * black - Used to format generated Python source files * prettier - Used to format generated Typescript source files

+

Installing the Binary Release

+

Binary releases of IDBS are available on GitHub at:

+

https://github.com/tmtsoftware/icd/releases

+

Please download the most recent release. The file is available as a zip file. It can be unpacked on Mac or Linux with:

+
unzip idbs-$version.zip
+
+

where $version is the release version.

+

Once the installation is unpacked it creates a directory named idbs-$version that contains three subdirectories: bin, conf, and lib. Inside bin are the application scripts: icd-db, icd-git, icd-viz, icd-fits and `icdwebserver.

+

The image below shows the basic directory structure of the IDBS binary distribution downloaded from GitHub:

+

+

The icd-db or icdwebserver program is needed to validate and ingest the directories containing your model files. You might want to put the idbs-$version/bin directory in your shell path.

+

Installing the Source Release

+

The source for the IDBS programs can be downloaded from the tmtsoftware GitHub repository with the command:

+
git clone https://github.com/tmtsoftware/icd.git
+
+

The git clone command will result in a local directly called icd. An install.sh script is provided that builds and installs all the subprojects into a directory called install_icd in the parent directory of the download directory (the ../install_icd directory). The install_icd directory contains the directories: bin, conf, and lib. Inside the bin directory are Linux/Mac friendly scripts to start the components of IDBS.

+

The code is built with the sbt build program, which must be downloaded and installed (see http://www.scala-sbt.org). That task is not covered here. The “All Platforms” or “Manual installation” is quick, which is the suggested approach.

+

The icdwebserver application starts the web application (by default on localhost:9000).

+

Installing MongoDB

+

In order to run the icd applications locally, it is necessary to install the database MongoDB, which is available at https://www.mongodb.org. The community edition is sufficient for our needs and instructions for installation can be found for a variety of platforms at

+

https://docs.mongodb.com/manual/administration/install-community/.

+

Note that it may be necessary to adjust system limits in order for mongod to run correctly. See

+

https://docs.mongodb.com/manual/reference/ulimit/.

+

Note: If you wish to “start over” with no database entries, you can use the command icd-db –drop db. Run icd-git –ingest to get the published APIs and ICDs from the released versions on GitHub.

+
+ + +
+
+
+
+ + +
+ + + + + + + + diff --git a/lib/material__tabs/dist/mdc.tabs.min.css b/lib/material__tabs/dist/mdc.tabs.min.css new file mode 100644 index 0000000000..4c61d383e3 --- /dev/null +++ b/lib/material__tabs/dist/mdc.tabs.min.css @@ -0,0 +1,6 @@ +/*! + Material Components for the web + Copyright (c) 2017 Google Inc. + License: Apache-2.0 +*/ +@-webkit-keyframes mdc-ripple-fg-radius-in{0%{-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1);transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1)}to{-webkit-transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1));transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1))}}@keyframes mdc-ripple-fg-radius-in{0%{-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1);transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1)}to{-webkit-transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1));transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1))}}@-webkit-keyframes mdc-ripple-fg-opacity-in{0%{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:0}to{opacity:1}}@keyframes mdc-ripple-fg-opacity-in{0%{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:0}to{opacity:1}}@-webkit-keyframes mdc-ripple-fg-opacity-out{0%{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:1}to{opacity:0}}@keyframes mdc-ripple-fg-opacity-out{0%{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:1}to{opacity:0}}.mdc-ripple-surface--test-edge-var-bug{--mdc-ripple-surface-test-edge-var:1px solid #000;visibility:hidden}.mdc-ripple-surface--test-edge-var-bug:before{border:var(--mdc-ripple-surface-test-edge-var)}.mdc-tab{font-family:Roboto,sans-serif;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-size:.875rem;font-weight:500;letter-spacing:.04em;line-height:1.5rem;text-decoration:inherit;text-transform:inherit;display:table-cell;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;min-width:160px;min-height:48px;padding:0 24px;text-align:center;text-decoration:none;white-space:nowrap;cursor:pointer;overflow:hidden;vertical-align:middle;color:rgba(0,0,0,.54);color:var(--mdc-theme-text-secondary-on-light,rgba(0,0,0,.54))}.mdc-tab:hover{color:rgba(0,0,0,.87);color:var(--mdc-theme-text-primary-on-light,rgba(0,0,0,.87))}.mdc-tab:focus{outline-color:rgba(0,0,0,.54);outline-color:var(--mdc-theme-text-secondary-on-light,rgba(0,0,0,.54))}.mdc-tab-bar--theme-dark .mdc-tab,.mdc-theme--dark .mdc-tab{color:hsla(0,0%,100%,.7);color:var(--mdc-theme-text-secondary-on-dark,hsla(0,0%,100%,.7))}.mdc-tab-bar--theme-dark .mdc-tab:hover,.mdc-theme--dark .mdc-tab:hover{color:#fff;color:var(--mdc-theme-text-primary-on-dark,#fff)}.mdc-tab-bar--theme-dark .mdc-tab:focus,.mdc-theme--dark .mdc-tab:focus{outline-color:hsla(0,0%,100%,.7);outline-color:var(--mdc-theme-text-secondary-on-dark,hsla(0,0%,100%,.7))}@media screen and (max-width:600px){.mdc-tab{min-width:72px;padding:0 12px}}.mdc-tab__icon{display:block;margin:0 auto;width:24px;height:24px}.mdc-tab-bar--icons-with-text .mdc-tab__icon{margin-top:4px}.mdc-tab__icon-text{display:block;margin:0 auto}.mdc-tab__icon+.mdc-tab__icon-text{padding-top:6px}.mdc-tab--active{color:rgba(0,0,0,.87);color:var(--mdc-theme-text-primary-on-light,rgba(0,0,0,.87))}.mdc-tab-bar--theme-dark .mdc-tab--active,.mdc-theme--dark .mdc-tab--active{color:#fff;color:var(--mdc-theme-text-primary-on-dark,#fff)}.mdc-tab--active:before{bottom:0}.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab{position:relative}.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:after{display:none;position:absolute;top:46px;left:0;width:calc(100% - 4px);height:2px;content:"";pointer-events:none;background-color:rgba(0,0,0,.87);background-color:var(--mdc-theme-text-primary-on-light,rgba(0,0,0,.87))}.mdc-tab-bar--theme-dark.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:after,.mdc-theme--dark .mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:after{background-color:#fff;background-color:var(--mdc-theme-text-primary-on-dark,#fff)}.mdc-toolbar .mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:after{background-color:#fff;background-color:var(--mdc-theme-text-primary-on-primary,#fff)}.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab--active:after,.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:active:after,.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:hover:after{display:block}.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:not(.mdc-tab--active):hover:after{opacity:.38}.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab--active,.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:not(.mdc-tab--active):active:after{opacity:.87}.mdc-tab-bar--icons-with-text:not(.mdc-tab-bar-upgraded) .mdc-tab:after{top:70px}.mdc-tab.mdc-ripple-upgraded{--mdc-ripple-surface-width:0;--mdc-ripple-surface-height:0;--mdc-ripple-fg-size:0;--mdc-ripple-left:0;--mdc-ripple-top:0;--mdc-ripple-fg-scale:1;--mdc-ripple-fg-translate-end:0;--mdc-ripple-fg-translate-start:0;will-change:transform,opacity;-webkit-tap-highlight-color:transparent}.mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):active:after,.mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):focus:before,.mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):hover:before{-webkit-transition-duration:85ms;transition-duration:85ms;opacity:.6}.mdc-tab.mdc-ripple-upgraded:after{background-color:rgba(0,0,0,.06);position:absolute;top:-50%;left:-50%;width:200%;height:200%;-webkit-transition:opacity .25s linear;transition:opacity .25s linear;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded:after{top:0;left:0;width:100%;width:var(--mdc-ripple-fg-size,100%);height:100%;height:var(--mdc-ripple-fg-size,100%);-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center;opacity:0}.mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded):after{-webkit-transform-origin:center center;transform-origin:center center}.mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded:after{top:0;top:var(--mdc-ripple-top,0);left:0;left:var(--mdc-ripple-left,0);width:100%;width:var(--mdc-ripple-fg-size,100%);height:100%;height:var(--mdc-ripple-fg-size,100%);-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation:after{-webkit-animation:.3s mdc-ripple-fg-radius-in forwards,83ms mdc-ripple-fg-opacity-in forwards;animation:.3s mdc-ripple-fg-radius-in forwards,83ms mdc-ripple-fg-opacity-in forwards}.mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation:after{-webkit-animation:83ms mdc-ripple-fg-opacity-out;animation:83ms mdc-ripple-fg-opacity-out;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1));transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1))}.mdc-tab.mdc-ripple-upgraded:before{background-color:rgba(0,0,0,.06);position:absolute;top:-50%;left:-50%;width:200%;height:200%;-webkit-transition:opacity .25s linear;transition:opacity .25s linear;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded:before{top:-50%;left:-50%;width:200%;height:200%;-webkit-transform:scale(0);transform:scale(0);-webkit-transform:scale(var(--mdc-ripple-fg-scale,0));transform:scale(var(--mdc-ripple-fg-scale,0))}.mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-focused:before{opacity:.99999}.mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-active-fill:before{-webkit-transition-duration:.12s;transition-duration:.12s;opacity:1}.mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded:before{top:0%;top:var(--mdc-ripple-top,0%);left:0%;left:var(--mdc-ripple-left,0%);width:100%;width:var(--mdc-ripple-fg-size,100%);height:100%;height:var(--mdc-ripple-fg-size,100%);-webkit-transform:scale(0);transform:scale(0);-webkit-transform:scale(var(--mdc-ripple-fg-scale,0));transform:scale(var(--mdc-ripple-fg-scale,0))}.mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded:before,.mdc-theme--dark .mdc-tab.mdc-ripple-upgraded:before{background-color:hsla(0,0%,100%,.16);position:absolute;top:-50%;left:-50%;width:200%;height:200%;-webkit-transition:opacity .25s linear;transition:opacity .25s linear;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded:before,.mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded:before{top:-50%;left:-50%;width:200%;height:200%;-webkit-transform:scale(0);transform:scale(0);-webkit-transform:scale(var(--mdc-ripple-fg-scale,0));transform:scale(var(--mdc-ripple-fg-scale,0))}.mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-focused:before,.mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-focused:before{opacity:.99999}.mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-active-fill:before,.mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-active-fill:before{-webkit-transition-duration:.12s;transition-duration:.12s;opacity:1}.mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded:before,.mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded:before{top:0%;top:var(--mdc-ripple-top,0%);left:0%;left:var(--mdc-ripple-left,0%);width:100%;width:var(--mdc-ripple-fg-size,100%);height:100%;height:var(--mdc-ripple-fg-size,100%);-webkit-transform:scale(0);transform:scale(0);-webkit-transform:scale(var(--mdc-ripple-fg-scale,0));transform:scale(var(--mdc-ripple-fg-scale,0))}.mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded:after,.mdc-theme--dark .mdc-tab.mdc-ripple-upgraded:after{background-color:hsla(0,0%,100%,.16);position:absolute;top:-50%;left:-50%;width:200%;height:200%;-webkit-transition:opacity .25s linear;transition:opacity .25s linear;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded:after,.mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded:after{top:0;left:0;width:100%;width:var(--mdc-ripple-fg-size,100%);height:100%;height:var(--mdc-ripple-fg-size,100%);-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center;opacity:0}.mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded):after,.mdc-theme--dark .mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded):after{-webkit-transform-origin:center center;transform-origin:center center}.mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded:after,.mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded:after{top:0;top:var(--mdc-ripple-top,0);left:0;left:var(--mdc-ripple-left,0);width:100%;width:var(--mdc-ripple-fg-size,100%);height:100%;height:var(--mdc-ripple-fg-size,100%);-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation:after,.mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation:after{-webkit-animation:.3s mdc-ripple-fg-radius-in forwards,83ms mdc-ripple-fg-opacity-in forwards;animation:.3s mdc-ripple-fg-radius-in forwards,83ms mdc-ripple-fg-opacity-in forwards}.mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation:after,.mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation:after{-webkit-animation:83ms mdc-ripple-fg-opacity-out;animation:83ms mdc-ripple-fg-opacity-out;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1));transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1))}.mdc-toolbar .mdc-tab.mdc-ripple-upgraded:before{background-color:hsla(0,0%,100%,.16);position:absolute;top:-50%;left:-50%;width:200%;height:200%;-webkit-transition:opacity .25s linear;transition:opacity .25s linear;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded:before{top:-50%;left:-50%;width:200%;height:200%;-webkit-transform:scale(0);transform:scale(0);-webkit-transform:scale(var(--mdc-ripple-fg-scale,0));transform:scale(var(--mdc-ripple-fg-scale,0))}.mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-focused:before{opacity:.99999}.mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-active-fill:before{-webkit-transition-duration:.12s;transition-duration:.12s;opacity:1}.mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded:before{top:0%;top:var(--mdc-ripple-top,0%);left:0%;left:var(--mdc-ripple-left,0%);width:100%;width:var(--mdc-ripple-fg-size,100%);height:100%;height:var(--mdc-ripple-fg-size,100%);-webkit-transform:scale(0);transform:scale(0);-webkit-transform:scale(var(--mdc-ripple-fg-scale,0));transform:scale(var(--mdc-ripple-fg-scale,0))}.mdc-toolbar .mdc-tab.mdc-ripple-upgraded:after{background-color:hsla(0,0%,100%,.16);position:absolute;top:-50%;left:-50%;width:200%;height:200%;-webkit-transition:opacity .25s linear;transition:opacity .25s linear;border-radius:50%;opacity:0;pointer-events:none;content:""}.mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded:after{top:0;left:0;width:100%;width:var(--mdc-ripple-fg-size,100%);height:100%;height:var(--mdc-ripple-fg-size,100%);-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center;opacity:0}.mdc-toolbar .mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded):after{-webkit-transform-origin:center center;transform-origin:center center}.mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded:after{top:0;top:var(--mdc-ripple-top,0);left:0;left:var(--mdc-ripple-left,0);width:100%;width:var(--mdc-ripple-fg-size,100%);height:100%;height:var(--mdc-ripple-fg-size,100%);-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation:after{-webkit-animation:.3s mdc-ripple-fg-radius-in forwards,83ms mdc-ripple-fg-opacity-in forwards;animation:.3s mdc-ripple-fg-radius-in forwards,83ms mdc-ripple-fg-opacity-in forwards}.mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation:after{-webkit-animation:83ms mdc-ripple-fg-opacity-out;animation:83ms mdc-ripple-fg-opacity-out;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1));transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1))}.mdc-tab.mdc-ripple-upgraded:focus{outline:none}.mdc-tab-bar{display:table;position:relative;height:48px;margin:0 auto;text-transform:uppercase}.mdc-tab-bar__indicator{position:absolute;bottom:0;left:0;width:100%;height:2px;background-color:rgba(0,0,0,.87);background-color:var(--mdc-theme-text-primary-on-light,rgba(0,0,0,.87));-webkit-transform-origin:left top;transform-origin:left top;-webkit-transition:-webkit-transform .24s cubic-bezier(0,0,.2,1) 0ms;transition:-webkit-transform .24s cubic-bezier(0,0,.2,1) 0ms;transition:transform .24s cubic-bezier(0,0,.2,1) 0ms;transition:transform .24s cubic-bezier(0,0,.2,1) 0ms,-webkit-transform .24s cubic-bezier(0,0,.2,1) 0ms;will-change:transform;visibility:hidden}.mdc-tab-bar--theme-dark .mdc-tab-bar__indicator,.mdc-theme--dark .mdc-tab-bar__indicator{background-color:#fff;background-color:var(--mdc-theme-text-primary-on-dark,#fff)}.mdc-toolbar .mdc-tab-bar .mdc-tab{color:hsla(0,0%,100%,.7);color:var(--mdc-theme-text-secondary-on-primary,hsla(0,0%,100%,.7))}.mdc-tab-bar--theme-dark .mdc-toolbar .mdc-tab-bar .mdc-tab,.mdc-theme--dark .mdc-toolbar .mdc-tab-bar .mdc-tab{color:hsla(0,0%,100%,.7);color:var(--mdc-theme-text-secondary-on-dark,hsla(0,0%,100%,.7))}.mdc-toolbar .mdc-tab-bar .mdc-tab--active,.mdc-toolbar .mdc-tab-bar .mdc-tab:hover{color:#fff;color:var(--mdc-theme-text-primary-on-primary,#fff)}.mdc-tab-bar--theme-dark .mdc-toolbar .mdc-tab-bar .mdc-tab--active,.mdc-tab-bar--theme-dark .mdc-toolbar .mdc-tab-bar .mdc-tab:hover,.mdc-theme--dark .mdc-toolbar .mdc-tab-bar .mdc-tab--active,.mdc-theme--dark .mdc-toolbar .mdc-tab-bar .mdc-tab:hover{color:#fff;color:var(--mdc-theme-text-primary-on-dark,#fff)}.mdc-toolbar .mdc-tab-bar .mdc-tab-bar__indicator{background-color:#fff;background-color:var(--mdc-theme-text-primary-on-primary,#fff)}.mdc-tab-bar--theme-dark .mdc-toolbar .mdc-tab-bar .mdc-tab-bar__indicator,.mdc-theme--dark .mdc-toolbar .mdc-tab-bar .mdc-tab-bar__indicator{background-color:#fff;background-color:var(--mdc-theme-text-primary-on-dark,#fff)}.mdc-tab-bar--icons-with-text{height:72px}.mdc-tab-bar--indicator-primary.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:after,.mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator,.mdc-tab-bar--theme-dark .mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator,.mdc-tab-bar--theme-dark .mdc-toolbar .mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator,.mdc-theme--dark .mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator,.mdc-theme--dark .mdc-toolbar .mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator,.mdc-toolbar .mdc-tab-bar--indicator-primary.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:after,.mdc-toolbar .mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator{background-color:#3f51b5;background-color:var(--mdc-theme-primary,#3f51b5)}.mdc-tab-bar--indicator-accent.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:after,.mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator,.mdc-tab-bar--theme-dark .mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator,.mdc-tab-bar--theme-dark .mdc-toolbar .mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator,.mdc-theme--dark .mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator,.mdc-theme--dark .mdc-toolbar .mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator,.mdc-toolbar .mdc-tab-bar--indicator-accent.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:after,.mdc-toolbar .mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator{background-color:#ff4081;background-color:var(--mdc-theme-secondary,#ff4081)}.mdc-tab-bar-scroller{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;background-color:inherit}.mdc-tab-bar-scroller,.mdc-tab-bar-scroller__scroll-frame{display:-webkit-box;display:-ms-flexbox;display:flex;overflow:hidden}.mdc-tab-bar-scroller__scroll-frame{position:relative;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.mdc-tab-bar-scroller__scroll-frame__tabs{-webkit-transition:-webkit-transform .24s cubic-bezier(0,0,.2,1) 0ms;transition:-webkit-transform .24s cubic-bezier(0,0,.2,1) 0ms;transition:transform .24s cubic-bezier(0,0,.2,1) 0ms;transition:transform .24s cubic-bezier(0,0,.2,1) 0ms,-webkit-transform .24s cubic-bezier(0,0,.2,1) 0ms;will-change:transform}.mdc-tab-bar-scroller__indicator{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:48px;cursor:pointer;visibility:hidden;color:rgba(0,0,0,.54);color:var(--mdc-theme-text-secondary-on-light,rgba(0,0,0,.54))}.mdc-tab-bar--theme-dark .mdc-tab-bar-scroller__indicator,.mdc-theme--dark .mdc-tab-bar-scroller__indicator{color:hsla(0,0%,100%,.7);color:var(--mdc-theme-text-secondary-on-dark,hsla(0,0%,100%,.7))}.mdc-tab-bar-scroller__indicator:hover{color:rgba(0,0,0,.87);color:var(--mdc-theme-text-primary-on-light,rgba(0,0,0,.87))}.mdc-tab-bar--theme-dark .mdc-tab-bar-scroller__indicator:hover,.mdc-theme--dark .mdc-tab-bar-scroller__indicator:hover{color:#fff;color:var(--mdc-theme-text-primary-on-dark,#fff)}.mdc-tab-bar-scroller__indicator__inner{color:inherit;text-decoration:inherit;cursor:inherit}.mdc-tab-bar-scroller__indicator__inner:focus{outline-color:inherit}.mdc-tab-bar-scroller[dir=rtl] .mdc-tab-bar-scroller__indicator__inner,[dir=rtl] .mdc-tab-bar-scroller .mdc-tab-bar-scroller__indicator__inner{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.mdc-tab-bar-scroller__indicator__inner:hover{color:inherit}.mdc-tab-bar--theme-dark .mdc-tab-bar-scroller__indicator__inner:hover,.mdc-theme--dark .mdc-tab-bar-scroller__indicator__inner:hover{color:hsla(0,0%,100%,.7);color:var(--mdc-theme-text-secondary-on-dark,hsla(0,0%,100%,.7))}.mdc-tab-bar-scroller__indicator--enabled{visibility:visible} \ No newline at end of file diff --git a/lib/prettify/lang-scala.js b/lib/prettify/lang-scala.js new file mode 100644 index 0000000000..3f97dba56f --- /dev/null +++ b/lib/prettify/lang-scala.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/], +["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]); diff --git a/lib/prettify/prettify.css b/lib/prettify/prettify.css new file mode 100644 index 0000000000..d44b3a2282 --- /dev/null +++ b/lib/prettify/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/lib/prettify/prettify.js b/lib/prettify/prettify.js new file mode 100644 index 0000000000..7b990496dd --- /dev/null +++ b/lib/prettify/prettify.js @@ -0,0 +1,30 @@ +!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a= +b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;ah[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com", +/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+ +s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/, +q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d= +c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"], +O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/, +V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-", +/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/], +["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}), +["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);p(v({keywords:Q, +hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]); +p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="
"+a+"
";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1}); +return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i + + + + + + + + + + + + + + + + + + + + + +Model Files · Interface Database System (IDBS) + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ + +
+
+
+

Model Files

+

In the OMOA, subsystem software consists of components: Hardware Control Daemons, Assemblies, Sequencers, and Applications. Model files that provide information about the component and its interfaces are created for each of the components. This section describes the model files. The model files are named: component-model, command-model, publish-model, alarm-model, and subscribe-model. In addition, each subsystem has a single subsystem-model file and may have one or more $subsystem-icd-model files that contain additional information about the interface between two subsystems. Separate files were created (rather than one larger file) in order to keep the configuration files simpler and easier to type.

+

The following table shows the different types of model files and what they describe:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Model File Description
subsystem-model.conf Contains high-level information about the subsystem that contains a group of components. There is one subsystem-model.conf file per subsystem.
component-model.conf Contains high-level component information. There is one component-model.conf file per component.
command-model.conf Describes the configuration commands the component supports. Also describes components and commands the component may send to other components. There is at most one command-model.conf file per component.
publish-model.conf Describes events the component publishes using Event Services. There is at most one publish-model.conf file per component.
service-model.conf Describes HTTP services provided or consumed by the component. The HTTP services themselves are described in OpenAPI files.
alarm-model.conf Describes alarms the component publishes using the Alarm Service. There is at most one alarm-model.conf file per component.
subscribe-model.conf Describes events the component subscribes to using Event Services. There is at most one subscribe-model.conf file per component.
$subsystem-icd-model.conf Where $subsystem is the name of one of the other TMT subsystems, for example: IRIS-icd-model.conf. These files may contain additional information about the interface between the subsystem being defined and another subsystem (IRIS in this example).
+

The component is only required to create a command-model.conf, publish-model.conf, alarm-model.conf, or subscribe-model.conf if it provides or uses the features described in the model files (i.e. if the component does not subscribe to events, then a subscribe-model.conf file is not needed).

+

Model files are text files written in a superset of JSON called HOCON, which provides syntactic sugar for writing JSON, but can be exported as pure JSON. In addition, most fields support GitHub style MarkDown as well as HTML tags. LaTeX math markup and UML are also supported (see below). In addition, it is possible to reuse certain repetitive definitions, such as those for events, commands and parameters by using the ref keyword in the model files to refer to another definition. The syntax is described below. Each type of model file has a schema which specifies the allowed structure of the contents within, including specifying the optional and required items, item types, allowed ranges, etc. The following sections describe each of the model files including necessary fields.

+

Markdown Support, Math, UML, Dot

+

In addition to using standard GitHub style MarkDown in descriptions, you can also insert LaTeX math formulas: Here is an example description text containing an inline math formula:

+
description = """
+Here is an example using LaTeX math: $`\frac{d}{dx}\left( \int_{0}^{x} f(u)\,du\right)=f(x)`$.
+And here is another: $`[x^n + y^n = z^n]`$.
+“””
+
+

And this is the inline math formula displayed from the above input:

+

+

Block math formulas are delimited by

+
```math
+
+``` 
+
+

For example:

+
Description = “””
+Here is an example using LaTeX math: $`\frac{d}{dx}\left( \int_{0}^{x} f(u)\,du\right)=f(x)`$.
+And here is another: $`[x^n + y^n = z^n]`$.
+
+This is a math block:
+
+```math
+$$\idotsint_V \mu(u_1,\dots,u_k) \,du_1 \dots du_k$$
+```
+
+and another:
+
+```math
+\frac{n!}{k!(n-k)!} = \binom{n}{k}
+```
+
+and a matrix:
+
+```math
+A_{m,n} =
+ \begin{pmatrix}
+  a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
+  a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
+  \vdots  & \vdots  & \ddots & \vdots  \\
+  a_{m,1} & a_{m,2} & \cdots & a_{m,n}
+ \end{pmatrix}
+```
+“””
+
+

The display for the above description is shown below:

+

+

UML (PlantUML) and Graphviz Dot are also supported, delimited by

+
```uml
+``` 
+
+

For example, below are some embedded UML blocks in a model file description text:

+
Description = “””
+
+and a small one:
+
+```uml
+Bob -[#red]> Alice : hello
+Alice -[#0000FF]->Bob : ok
+```
+
+Note that according to https://plantuml.com/dot you can also use Graphviz/Dot diagrams instead of UML:
+
+```uml
+digraph foo {
+  node [style=rounded]
+  node1 [shape=box]
+  node2 [fillcolor=yellow, style="rounded,filled", shape=diamond]
+  node3 [shape=record, label="{ a | b | c }"]
+
+  node1 -> node2 -> node3
+}
+```
+"""
+
+

Below is the display produced from the above description text:

+

+

Inner-Document Links

+

It is possible to make inner-document links to existing anchors using Markdown syntax. The easiest way to see the syntax for the ids is to look at the generated HTML. For example, the output of:

+
icd-db -s NFIRAOS -o NFIRAOS.html
+
+

Note that the name attribute is used in the generated HTML instead of id, since the PDF generator required that. Many of the anchors have the following syntax:

+

<thisComponent->action-<itemType->subsystem.<component.>name

+

where

+
    +
  • $thisComponent is the component being described
  • +
  • $action is one of {publishes, subscribes, sends, receives}
  • +
  • $itemType is one of {Event, ObserveEvent, Alarm, Command}
  • +
  • $subsystem is the subsystem for the item
  • +
  • $component is the component for the item
  • +
  • $name is the name of the item being published, subscribed to, or the command being sent or received
  • +
+

For example, to link to the description of a published event named heartbeat in the lgsWfs component in the TEST subsystem:

+
See: [here](#lgsWfs-publishes-Event-TEST.lgsWfs.heartbeat). 
+
+

Reusing Definitions for Events, Commands, Parameters (refs)

+

It is possible to reuse similar parts of event, command and parameter definitions by using the ref keyword. The example below uses a reference to an event (engMode) in another event (engMode2):

+
  events = [
+    {
+      name = engMode
+      description = "LGS WFS engineering mode enabled"
+      archive = false
+      parameters = [
+        ...
+      ]
+    }
+    {
+      name = engMode2
+      description = "LGS WFS engineering mode 2 enabled"
+      archive = true
+      ref = engMode
+    }
+
+

In the above example, the event engMode2 will have the same settings and parameters as engMode, except for description and archive, which are overridden. Any fields, which are not set, are inherited from the referenced event. This works for events, commands and parameters, as shown in the parameter reference example below:

+
      parameters = [
+        {
+          name = mode3
+          ref = engMode/parameters/mode
+        }
+
+
+

In the above example, the parameter mode3 will be exactly the same as the mode parameter in the engMode event in the same component. You could also specify a different description field or any other parameter fields that should override the ones defined for mode.

+

The syntax of the ref value is flexible and allows you to reference any event, command or parameter in any component within the same subsystem. You can use a full path to specify a reference to an item in another component, or an abbreviated path for items in the same scope. The full syntax of a ref is something like this:

+

componentName/section/eventName[/parametersSection/paramName]

+

For example, to reference an event, observe event or current state, use:

+
    +
  • componentName/events/eventName
  • +
  • or componentName/observeEvents/eventName
  • +
  • or componentName/currentState/eventName
  • +
  • or events/eventName, … (if in the same component)
  • +
  • or just eventName (if in the same component and event type section) For commands received, the syntax is similar:
  • +
  • componentName/receive/commandName
  • +
  • or just commandName (if in the same component)
  • +
+

The syntax for references to parameters of events adds the parameters keyword and the parameter name:

+
    +
  • componentName/events/eventName/parameters/paramName
  • +
+

or abbreviated as described above for events:

+
    +
  • observeEvents/eventName/parameters/paramName (in same component)
  • +
  • or eventName/parameters/paramName (in same component and events section)
  • +
+

Or just paramName (if in the same parameters section)

+

The syntax for parameters of commands is similar. Here you need to specify if the parameters appear in the “parameters” section or in the “resultType”.

+
    +
  • componentName/receive/commandName/parameters/paramName
  • +
  • or componentName/receive/commandName/resultType/paramName
  • +
+

Or abbreviated as described above.

+

See the example model files in the icd sources for some examples of the ref keyword.

Note
+

If there is an error in the reference, the error message is displayed in the log output of the icd-db command, if it is used, and also inserted in the generated HTML or PDF document (in the details section).

+

Below is an example that demonstrates some of the ref syntax for event parameters:

+
  events = [
+    {
+      name = engMode3
+      description = "LGS WFS engineering mode enabled 3"
+      archive = true
+      parameters = [
+        {
+          // Example reference to a parameter in this component
+          name = mode3
+          ref = engMode/parameters/mode
+        }
+        {
+          // Example reference to a parameter in this component (using wrong ref to produce error in HTML/PDF output)
+          name = mode3Error
+          ref = engMode/parameters/modeXXX
+        }
+
Note
+

Note: An earlier version of the icd software used the terms “attributes” for events parameters and “args” for command parameters. These have been renamed to “parameters” for compatibility with CSW, however for backward compatibility the previous names are also allowed in refs.

+

Using Jsonnet for Model Files

+

Normally, the icd model files are written in HOCON format, a simplified JSON format, and have a .conf suffix. In some cases, you may want to have more features available, for example to refer to similar definitions in may different places. The icd software also supports model files using the jsonnet data templating language, which lets you define variables and functions and reuse them. To do this, replace the .conf suffix with .jsonnet (or .libsonnet for jsonnet files you want to import) and follow the syntax rules for jsonnet, so that the resulting JSON, after being processed by jsonnet conforms to the icd JSON schema. The icd software will automatically preprocess the jsonnet model files when they are imported into the icd database.

+

For example, you can add some common, reusable, top level definitions in a file utils.libsonnet:

+
// Define a common event
+{
+  heartbeat: {
+    name: 'heartbeat',
+    description: 'Heartbeat event description...',
+    parameters: [
+      {
+        name: 'heartbeat',
+        description: 'software heartbeat',
+        type: 'integer',
+      },
+    ],
+  },
+
+  // Defines a function to generate a common event model based on the given arguments
+  commonEventFunc(eventName, paramName, typeName):: {
+    name: eventName,
+    description: eventName + ' description.',
+    archive: false,
+    parameters: [
+      {
+        name: paramName,
+        description: 'Description for ' + paramName,
+        type: typeName,
+      },
+    ],
+  },
+}
+
+

And then reference these definition in a publish-model.jsonnet file for a different component. Below is an example publish-model.jsonnet file that imports reusable jsonnet code:

+
// Import common function defined in another file
+local utils = import '../utils.libsonnet';
+
+{
+  subsystem: 'TEST',
+  component: 'jsonnet.example',
+
+  // comments can use // or #
+  publish: {
+    description: |||
+      Multi-line descriptions
+      use this syntax in jsonnet
+    |||,
+
+    events: [
+      // define two similar events using imported function
+      utils.commonEventFunc('myEvent1', 'param1', 'boolean'),
+      utils.commonEventFunc('myEvent2', 'param2', 'string'),
+
+      // Insert an imported event definition
+      utils.heartbeat,
+
+      // define another event
+      {
+        name: 'state',
+        // Import the description text
+        description: importstr '../importRaw.txt'
+,
+        archive: false,
+        parameters: [
+          {
+            name: 'state',
+            description: 'Detector state',
+            enum: ['EXPOSING', 'READING', 'IDLE', 'ERROR'],
+          },
+        ],
+      },
+    ],
+  },
+}
+
+

The above example defines two events (myEvent1 and myEvent2) that are similar, but configured based on the given function arguments. The heartbeat event is used as is. The state event is defined in the usual way (for JSON), but imports the description text from a file.

+

Subsystem-model

+

The subsystem model describes the overall subsystem. There is one subsystem-model.conf file for each subsystem.

+

Each subsystem may consist of several components. The IDBS merges them to create a subsystem API or ICD.

+

As an example, the subsystem-model.conf JSON schema file is shown below. This schema file is being shown for reference. Users are not expected to interact with the schema files directly, but rather use this manual to understand how to structure their model files.

+

subsystem-model.conf JSON schema:

+
id: "http://csw.tmt.org/subsystem-schema#"
+"$schema": "http://json-schema.org/draft-07/schema#"
+
+description = "Defines the model describing a top level subsystem"
+type = object
+additionalProperties: false
+required = [modelVersion, subsystem, title, description]
+properties {
+  _id {
+    description = "Optional unique id (automatically generated)"
+    type = string
+  }
+  _version {
+    description = "Optional version (automatically generated)"
+    type = integer
+  }
+  modelVersion {
+    description = "The version of the model file as Major.Minor version"
+    type = string
+    pattern = "^[0-9]+\\.[0-9]+$"
+  }
+  subsystem {
+    description = "The name of this Subsystem"
+    include classpath("3.0/subsystem.conf")
+  }
+  title {
+    description = "The title of this subsystem, for display"
+    type = string
+  }
+  description {
+    description = "A description of this subsystem"
+    type = string
+  }
+}
+
+

The line starting with required = shows the required fields in the subsystem.conf file are: modelVersion, subsystem, title, and description. The following lines in the schema file describe each of the fields. Note also that modelVersion requires a pattern given by a regular expression. The modelVersion must be a value like Major.Minor with at least 1 digit on each side of the period such as 3.0 (The latest version).

+

The fields for subsystem.conf are shown in the table below. The field name, whether it is required, and any special notes for the field are shown. Notes include required formats or conventions for a value.

+

Required and optional fields for subsystem.conf:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Required? Notes
modelVersion yes Must be a Major.Minor version with Major and Minor digits. Currently these values are supported: 1.0, 2.0, 3.0 (the latest version).
subsystem yes Name of the subsystem. Must be the same as SE subsystem name.
title yes The title of the subsystem. Will be displayed in generated documents. The title can contain spaces and other marks but should be one line.
description yes A description of the subsystem. The description is in triple quotes for multi-lined text. Note that spaces between paragraphs are retained and the text can contain GitHub flavored Markdown as well as HTML markup.
+

The modelVersion is the model version for the entire subsystem. Each component also has a modelVersion field. This allows each component to be updated independently and then the subsystem to be updated as a whole.

+

The subsystem field is the subsystem name. It must be one of the subsystem abbreviations from the SE N2 document. The list is shown below.

+
// Enumeration including all available subsystems
+enum = [
+  ENC, // Enclosure
+  SUM, // Summit Facilities
+  STR, // Structure
+  M2S, // M2 System
+  M3S, // M3 System
+  CLN, // Mirror Cleaning System
+  TINS, // Test Instruments
+  TCS, // Telescope Control System
+  M1CS, // M1 Control System
+  APS, // Alignment and Phasing System
+  OSS, // Observatory Safety System
+  ESEN, // Engineering Sensor System
+  NFIRAOS, // Narrow Field Infrared AO System
+  NSCU, // NFIRAOS Science Calibration Unit
+  LGSF, // Lasert Guide Star Facility
+  AOESW, // AO Executive Software
+  CRYO, // Cryogenic Cooling System
+  IRIS, // InfraRed Imaging Spectrometer
+  MODHIS, // Multi-Object Diffraction-limited High-resolution Infrared Spectrograph
+  REFR, // Refrigeration Control System
+  WFOS, // Wide Field Optical Spectrometer
+  CIS, // Communications and Information Systems
+  CSW, // Common Software
+  DMS, // Data Management System
+  ESW, // Executive Software System
+  SOSS, // Science Operations Support System
+  DPS, // Data Processing System
+  SCMS // Site Conditions Monitoring System
+]
+
+

The example below will create a TCS subsystem. The description comes from the text of the TCS CoDR software design document. Triple quotes allow multi-line entries.

+
subsystem=TCS
+title="TELESCOPE CONTROL SYSTEM (TCS)"
+modelVersion="3.0"
+description="""
+The main functions of the TCS are: 
+1) Points and tracks targets in various reference frames by generating position demands for subsystems and instruments. Generates pointing models to remove repeatable mechanical errors and applies pointing models terms to correct mount demands.
+2) Implements a key part in acquisition, guiding and wavefront sensing 
+…
+"""
+
+

Optional $subsystem-icd-model file

+

There may be zero or more of these model files in the top level directory (which also contains subsystem-model.conf). Replace $subsystem with the name of the other subsystem that has an interface with the one being defined. For example, if you are defining the NFIRAOS subsystem model files and want to include extra information about the ICD between IRIS and NFIRAOS, you could add a file named IRIS-icd-model.conf:

+
subsystem = NFIRAOS
+title = "Interface between NFIRAOS and IRIS"
+description = """
+The communication, software and control interfaces between NFIRAOS and IRIS consist of the following:
+* Transfer of pixel compression gain and offset coefficients from the OIWFS detector controller to the NRTC.
+* Transfer of pixel compression gain and offset coefficients from the IRIS Imager detector controller to the NRTC.
+* Transfer of residual field rotation angle OIWFS from the NFIRAOS RTC to the IRIS SRO.
+* Transfer of the IRIS OIWFS ADC ellipticity correction streams from the NFIRAOS RTC to the IRIS SRO. The corrections include the widths of the elliptical Gaussian image and angle between the ellipse axis and the local X axis.
+* Transfer of the IRIS OIWFS pixels from the IRIS OIWFS detector controllers to the NFIRAOS RTC.
+* Transfer of the IRIS ODGW pixels from the IRIS detector controllers to the NFIRAOS RTC.
+* Transfer of probe position errors due to TT offloading from the NFIRAOS RTC to the IRIS SRO.
+* Transfer of the NFIRAOS Optical Enclosure state to the OIWFS Enclosure.
+* Bi-directional sharing of respective temperatures of NFIRAOS and OIWFS enclosures
+* Transfer of NFIRAOS configuration, state, and performance information to the IRIS Data Reduction System (DRS).
+"""
+
+

The fields in the $subsystem-icd-model.conf file are shown below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Required? Notes
subsystem yes Name of the subsystem being defined (same as in subsystem-model.conf)
title no Optional title to be displayed before the description (If missing, a default title will be used)
description yes Text describing the interface between the two subsystems (may include Markdown, HTML)
targetSubsystem no Name of the other subsystem that has an interface with this one (Defaults to the one in the file name)
+

Component-model

+

There is one component-model.conf file for each component in the subsystem. The component model file provides high level information about the component. The fields of the component-model.conf are shown in the following table:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
modelVersionyesThis is the modelVersion for a single component. It must be a Major.Minor version with Major and Minor digits (1.0, 2.0 and 3.0 are currently supported).
subsystemyesName of the subsystem the component belongs to. It must be an entry from the SE subsystem list.
wbsIdnoThe WBS element from the cost book this component belongs to such as: TMT.TEL.CONT.TCS.
componentTypeyesMust be: Assembly, HCD, Sequencer, Application, or Container
componentyesThe name of the component. Will be displayed in documents. The component name may contain spaces and dots, but, as of modelVersion 2.0, not a dash “-“. The prefix for a component, which is needed to subscribe to events, is defined as subsystem.component.
titleyesThe title of the component. Will be displayed in documents. The title can include spaces but should be one line.
descriptionyesA description of the component (may contain Markdown or HTML markup). The description is in triple quotes for multi-lined text. Note that spaces between paragraphs are retained.
+

An example component-model.conf file (for the TCS Pointing Kernel Assembly, described in the TCS CoDR WBS) is shown below:

+
subsystem = TCS
+component = TCS PK Assembly
+modelVersion = "3.0"
+wbsId = tmt.tel.cont.tcs.tpk
+title = "Telescope Pointing Kernel Assembly"
+componentType = Assembly
+
+description = """
+Pointing Kernel Assembly is responsible for receiving target and offset commands. Based on targets received assembly will produce stream of target demands that will be used by
+tracking mechanism in Mount,Enclouser,Rotator,Guiders,Probes etc. Pointing Kernel Assembly utilizes C++ based third party libraries like tpk,slalib,tcspk.
+""" 
+
+

The icd-db program can output a document in PDF or HTML format with the –o option. The figure below shows a portion of the PDF output related to the above component-model.conf file:

+

+

Parameters, Types and Units

+

The following two sections describe events and commands, both of which can have sets of parameters. A parameter can have a number of fields defined in the file parameter-schema.json. Minimally, it must be a name, description, and type or a name, description, and enum (enumeration). Parameter fields are described in the table below. Parameter field names must be unique within an event item.

+

The table below lists the set of required fields for parameters. Note that yes/no here means that one of type or enum is required, but both are not possible in the same parameter.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
nameyesThe name of a parameter in the enclosing item.
descriptionyesA text description of the parameter.
typeyes/noThe type of a value or array. Can be one of: array, boolean, integer, string, byte, short, long, float, double, taiTime, utcTime, eqCoord, solarSystemCoord, minorPlanetCoord, cometCoord, altAzCoord, coord
(corresponding to supported types in the CSW software: See below).
enumyes/noAn enum as in enum = {A, B}
+

Other fields can be optionally added to the parameter as needed, depending on the type of parameter. For values that have units, the units must be one of the allowed CSW units (see below).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
unitsyes if possibleThe units of a value in a parameter. See below for allowed values.
minItemsnoIf the parameter is a one-dimensional array, this specifies the minimum number of items in the array. Can also be specified using the dimensions field for arrays types (see below).
maxItemsnoIf the parameter is a one-dimensional array, this specifies the maximum number of items in the array. Can also be specified using the dimensions field for arrays types (see below).
minLengthnoFor string parameters, the minimum expected string length.
maxLengthnoFor string parameters, the maximum expected string length.
dimensionsnoIf the parameter value is a multi-dimensional array, this is an array of dimension sizes for the value.
minimumnoWhen a value can be a range, this is the minimum possible (a number or -inf).
maximumnoWhen a value can be a range, this is the maximum possible (a number or inf).
exclusiveMinimumnoWhen a value can be a range, this is the minimum possible, exclusive of this value (a number or –inf).
exclusiveMaximumnoWhen a value can be a range, this is the maximum possible, exclusive of this value (a number or inf).
defaultnoThis is the default value for the parameter, if there is one.
allowNaNnoSet to true if the parameter value can be NaN (default: false)
+

FITS Keywords

+

In addition to the above fields, event parameters may contain fields with information about the FITS keywords for which the parameter is the source:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
keywordnoThis is the name of the FITS keyword generated from the parameter value.
channelnoIf the FITS keyword has multiple source parameters, this specifies the channel name for this source.
keywordsnoUse if multiple FITS keywords are produced from this event parameter (See below).
+

For the keywords field in the above table: If multiple keywords are produced from an event parameter (from different parts of an array or matrix), this form can be used:

+
keywords: [
+  {
+    keyword = OIWFS1PS
+    rowIndex = 0
+  }
+  {
+    keyword = OIWFS2PS
+    rowIndex = 1
+  }
+  {
+    keyword = OIWFS3PS
+    rowIndex = 2
+  }
+]
+
+

In this format, rowIndex refers to a row in a matrix parameter value, while index refers to an index in the parameter value array.

+

Parameter Types

+

The table below lists the available types for parameters, which correspond to the supported parameter types in the CSW framework. Note that a parameter in CSW can always have multiple values. It is not necessary (or supported) to define an array of strings or booleans, since a string or boolean parameter can already have multiple values.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDescription
boolean,integer, string, byte, short, long, float, doubleValues have the corresponding primitive types in Scala, Java, Typescript, etc.
arrayAn array or matrix of (lists of) numerical values (not string or boolean)
taiTime, utcTimeHolds TAI or UTC time values
EqCoord, solarSystemCoord, minorPlanetCoord, cometCoord, altAzCoord, coordSee the CSW source for details of these coordinate parameter types.
Note that coord (CSW Coord) is a base type that can be used for any of the coordinate types.
+

If the parameter type is an array, there are some special tags for describing it. The minItems and maxItems parameters can be used for 1-Dimensional arrays and is especially useful for arrays with a variable length. However, for other arrays, including higher dimensional arrays, a dimensions tag can be used, with a syntax of [x,y,z,…] where x, y, and z are positive integers specifying the size of each dimension. Note that the CSW framework only supports numerical array and matrix types, although each item of the array or matrix can be a list of one or more values.

+

To describe the items in an array, an “items” block is used. Within it, the type is set using the type field. The mimimum, maximum, exclusiveMinimum, and exclusiveMaximum fields may be used as well.

+

In the CSW framework, only numerical array parameter types are supported, however since every parameter may have multiple values, it is usually not necessary to declare the type as an array.

+

Note that the value of the mimimum, maximum, exclusiveMinimum, and exclusiveMaximum fields may be numeric or “inf” or “-inf” (for +/- infinity).

+

Units

+

The CSW software defines a list of standard units that are accepted. If not in this list, please add it to the description field and/or request that it be added to the standard list.

+

Note: This list can be found in the icd source tree under icd-db/src/main/resources/3.0/units.conf

+
// Enumeration including all available CSW units
+
+enum = [
+  // SI units
+  angstrom    // angstrom
+  alpha       // alpha: fine structure constant
+  ampere      // ampere: unit of electric current
+  arcmin      // arc minute; angular measurement
+  arcsec      // arc second: angular measurement
+  bar         // bar: metric ton of pressure
+  candela     // candela(lumen/sr)
+  day         // day
+  degree      // degree: angular measurement 1/360 of full rotation
+  degC        // Degree Celsius K
+  degF        // Fahrenheit
+  elvolt      // electron volt
+  gauss       // gauss
+  gram        // gram
+  hertz       // frequency
+  henry       // Henry
+  hour        // hour
+  joule       // Joule: energy
+  kelvin      // Kelvin: temperature with a null point at absolute zero
+  kilogram    // kilogram, base unit of mass in SI
+  kilometer   // kilometers
+  liter       // liter, metric unit of volume
+  lm          // lumen
+  lsun        // solar luminosity
+  lx          // lux(lm/m2)
+  mas         // milli arc second
+  me          // me(electron_mass)
+  meter       // meter: base unit of length in SI
+  microarcsec // micro arcsec: angular measurement
+  millimeter  // millimeters
+  millisecond // milliseconds
+  micron      // micron: alias for micrometer
+  micrometer  // micron
+  minute      // minute
+  MJD         // Mod. Julian Date
+  mol         // mole- unit of substance
+  month       // Month name or number
+  mmyy        // mmyy: Month/Year
+  mu0         // mu0: magnetic constant
+  muB         // Bohr magneton
+  nanometer   // nanometers
+  newton      // Newton: force
+  ohm         // Ohm
+  pascal      // Pascal: pressure
+  pi          // pi
+  pc          // parsec
+  ppm         // part per million
+  radian // radian: angular measurement of the ratio between the length of an arc and its radius
+  second // second: base unit of time in SI
+  sday   // sidereal day is the time of one rotation of the Earth
+  steradian // steradian: unit of solid angle in SI
+  volt      // Volt: electric potential or electromotive force
+  watt      // Watt: power
+  Wb        // Weber
+  week      // week
+  year      // year
+
+  // CGS units
+  coulomb    // coulomb: electric charge
+  centimeter // centimeter
+  D          // Debye(dipole) A electric dipole moment
+  dyn        // dyne: Unit of force
+  erg        // erg: CGS unit of energy
+
+  // Astropyhsics units
+  au        // astronomical unit: approximately the mean Earth-Sun distance
+  a0        // bohr radius: probable distance between the nucleus and the electron in a hydrogen atom in its ground state
+  c         // c: speed of light
+  cKayser   // cKayser
+  crab      // Crab: astrophotometrical unit for measurement of the intensity of Astrophysical X-ray sources
+  damas     // damas: degree arcminute arcsecond (sexagesimal angle from degree)
+  e         // electron charge
+  earth     // earth (geo) unit
+  F         // Farad: F
+  G         // gravitation constant
+  geoMass   // Earth Mass
+  hm        // hour minutes (sexagesimal time from hours)
+  hms       // hour minutes seconds (sexagesimal time from hours)
+  hhmmss    // hour minutes seconds (sexagesimal time)
+  jansky    // Jansky: spectral flux density
+  jd        // Julian Day
+  jovmass   // Jupiter mass
+  lightyear // light year
+  mag       // stellar magnitude
+  mjup      // Jupiter mass
+  mp        // proton_mass
+  minsec    // minutes seconds (sexagesimal time from minutes)
+  msun      // solar mass
+  photon    // photon
+  rgeo      // Earth radius (eq)
+  rjup      // Jupiter Radius(eq)
+  rsun      // solar radius
+  rydberg   // energy of the photon whose wavenumber is the Rydberg constant
+  seimens   // Seimens
+  tesla     // Tesla
+  u         // atomic mass unit
+
+  // Imperial units
+  barn  // barn: metric unit of area
+  cal   // thermochemical calorie: pre-SI metric unit of energy
+  foot  // international foot
+  inch  // international inch
+  pound // international avoirdupois pound
+  mile  // international mile
+  ounce // international avoirdupois ounce
+  yard  // international yard
+
+  // Others - engineering
+  NoUnits // scalar - no units specified
+  bit     // bit: binary value of 0 or 1
+  encoder // encoder counts
+  count   // counts as for an encoder or detector
+  mmhg    // millimetre of mercury is a manometric unit of pressure
+  percent // percentage
+  pix     // pixel
+
+  // Datetime units
+  tai      // TAI time unit
+  utc      // UTC time unit
+  date     // date
+  datetime // date/time
+]
+
+

Parameter Examples

+

Below are some examples of parameter definitions:

+
parameters = [
+        {
+          name = temp_ngsWfs
+          description = "NGS WFS temperature"
+          type = float
+          units = kelvin
+          exclusiveMinimum: -inf
+          exclusiveMaximum: inf
+          allowNaN: true
+	    keyword = IMGTMPXX
+        }
+        {
+          name = temp_lgsWfs
+          description = "LGS WFS temperature"
+          type = float
+          units = kelvin
+          exclusiveMinimum: 0
+          exclusiveMaximum: 100
+          allowNaN: true
+        }
+        {
+          name = temp_ndme
+          description = "NDME crate temperatures"
+          type = array
+          dimensions: [7]
+          items = {
+            type = float
+            units = kelvin
+          }
+        }
+        {
+          name = temp_actuator
+          description = "motor & piezo actuator temperatures"
+          type = array
+          dimensions: [30]
+          items = {
+            type = float
+            minimum = 1.234
+            units = kelvin
+          }
+        }
+      ]
+
+

Publish-model

+

Each component can publish events, observe events, images and current state. Other systems can subscribe or get these. A component’s published events and images are described in the publish-model.conf file. The file consists of some high-level content and then sections for events, observeEvents, images and currentState.

Note
+

As per Change Request 261, the telemetry and event services have been merged into one unified service, and telemetry items distinct from events have been eliminated. Furthermore, events and event streams have also been consolidated into a single event type.

+

The table below lists the required and optional fields for publish-model.conf:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
subsystemyesName of the subsystem. Must be the same as SE subsystem name. Should be the same as the component-model.conf and subsystem-model.conf
componentyesThe name of the component.
publishyesThis is a container for the kinds of data the system publishes. It is required.
+

The publish block contains a description and then containers for the different kinds of publishable events. The table below lists the fields for the required publish block:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
descriptionnoOptional overview or notes on items published by the component.
eventsnoBlock for events that are published by the component
observeEventsnoBlock for observe events that are published by the component. There is a list of predefined observe events (see below).
imagesnoBlock for images that are published by the component.
currentStatesnoBlock for current states that are published by the component.
alarmsnoBlock for alarms published by the component (Deprecated: See alarm-model.conf below).
+

Note that the publish-model.conf file is not required if the container does not publish any events or . Note also that none of the fields of the publish container are required. Adding a publish-model.conf file to the component model that is empty will create an empty section in the documentation (In that case it would be preferable to leave out the publish-model.conf file). The following tables discuss each of the different kinds of events.

+

Events

+

The event container is an array containing one or more event items.

+

Events fall into the following categories. The purpose of the categories is to easily find events of different categories without a catalog.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
CategoryDescription
DEMANDAn event that is used to transmit a desired position. These events are high frequency/periodic and should not be archived long-term or should be seriously curated into a smaller representative collection.
CONTROLSimilar to a DEMAND, but probably not periodic and considerably less frequent. CONTROL events are events driving other devices, but may be internal to a system. These also may be curated.
EVENTAn event that is used to indicate that something has happened. Observe Events are one EVENT type.
STATUS(Default) Used primarily to update a user interface. These events are archived. They are not high frequency and are not periodic.
+

The fields of an event item are shown in the table below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
nameyesThe name of the event item. This should be a simple name like “zenithAngle”. The prefix for all events is subsystem.component.
categorynoThe event category (One of: DEMAND, CONTROL, EVENT, STATUS).
descriptionnoAn optional description of a single event item (may contain Markdown and HTML). The description is in triple quotes for multi-lined text. Note that spaces between paragraphs are retained.
requirementsnoList of requirements that flow to this item.
maxRatenoMaximum publishing rate in Hz.
archivenoA Boolean (true/false) stating whether the component recommends archiving this eventitem.
archiveDurationif archive is trueLifetime of the archiving (for example ‘2 years’ or ‘6 months’)
parametersyesA container of parameters that belong to this event item.
+

Unlike an EPICS channel, a CSW event can contain several associated keys and values (called parameters in the schema).

+

An excerpt from an example publish-model.conf file for the TCS pk Assembly is shown below. It shows part of the definition of the zenithAngle event.

+
publish {
+    event = [
+    {
+      name = zenithAngle
+      description = """
+       |The zenith angle is the distance in degrees of the telescope's optical axis from the zenith.
+       |
+       |The zenithAngle event item includes both the zenith angle for the current position of the
+       |telescope
+       |as well as the demanded zenith angle. When the telescope is tracking, the error between 
+       |demand and current should be zero.
+       |"""
+      requirements = [“REQ-2-TCS-4270”]
+      maxRate = 20
+      archive = true
+      archiveDuration = 1 year
+      parameters = [
+        {
+          name = current
+          description = "Actual or current zenith angle of the telescope"
+          type = float
+          minimum = 0
+          maximum = 90
+          units = degree
+        }
+        {
+          name = demand
+          description = "The demanded zenith angle of the telescope"
+          type = float
+          minimum = 0
+          maximum = 90
+          units = degree
+        }
+      ]
+    }
+
+

The annotated screenshot below shows the portion of the file generated by the command: icd-db -s TCS –o TCS.pdf, which generates a PDF file for the TCS subsystem. The figure shows where each of the fields ends up on the final product.

+

+

Observe Events

+

Observe events are different from other events in that they are predefined. For this reason you only need to list the name of the observe event in the publish model file under observeEvents. For example:

+
observeEvents = [
+    ObserveStart
+    ObserveEnd
+]
+
+

The predefined observe event names are references to the tmt-icd/ESW-Model-Files definitions on GitHub.

+

Below is an example that references all the predefined observe events:

+
  observeEvents = [
+    ObserveStart
+    ObserveEnd
+    ExposureStart
+    ExposureEnd
+    ReadoutEnd
+    ReadoutFailed
+    DataWriteStart
+    DataWriteEnd
+    ExposureAborted
+    PrepareStart
+
+    // IRDetector specific
+    IRDetectorExposureData
+    IRDetectorExposureState
+
+    // OpticalDetector specific
+    OpticalDetectorExposureData
+    OpticalDetectorExposureState
+
+    // WFSDetector specific
+    WfsDetectorExposureState
+    PublishSuccess
+    PublishFail
+
+    // Sequencer specific
+    PresetStart
+    PresetEnd
+    GuidestarAcqStart
+    GuidestarAcqEnd
+    ScitargetAcqStart
+    ScitargetAcqEnd
+    ObservationStart
+    ObservationEnd
+    ObservePaused
+    ObserveResumed
+    DowntimeStart
+
+    // DMS specific
+    MetadataAvailable
+    ExposureAvailable
+  ]
+
+

Images

+

The images section of the publish-model.conf file is used to declare that a component publishes images that other components can subscribe to (via the TMT VIZ APIs that are to be defined).

+

The images container is an array containing one or more image description items. The fields of an image item are shown in the following table:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
nameyesThe name of the image item. This should be a simple name like “guider1”. The prefix for all images is subsystem.component.
descriptionyesA description of a single image item (may contain Markdown and HTML). The description is in triple quotes for multi-lined text.
channelyesThe VIZ image channel (for example: viz.wfos.agwfs1)
formatnoThe image format (default: FITS)
sizeyesAn array of two numbers: the image dimensions (for example: [2048, 2048]])
pixelSizeyesNumber of bytes per pixel
maxRatenoMaximum rate the image is published
metadatayesA container of one or more metadata items that belong to this image.
+

The format of a single metadata item for an image is shown in the table below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
nameyesName of the image metadata
descriptionyesA description of this metadata
typeyesThe data type of the keyword value (One of: [boolean, integer, string, byte, short, long, float, double])
keywordnoFITS keyword (for example: SCALE, ITIME)
+

Below is an example section of a publish-model.conf file that shows two published images. Other components can then reference these images in the subscribe-model.conf file to indicate that they will subscribe to the published images.

+
  images = [
+    {
+      name = guider1
+      description = "Images from the WFOS AGWFS 1"
+      channel = viz.wfos.agwfs1
+      format = FITS
+      size = [2048, 2048]
+      pixelSize = 2
+      maxRate = 5.0
+      metadata = [
+        {
+          name = platescale
+          type = float
+          description = "platescale of image in arcsec/pixel"
+          keyword = SCALE
+        }
+        {
+          name = integrationTime
+          type = integer
+          description = "integration time of image in ms"
+          keyword = ITIME
+        }
+      ]
+    }
+    {
+      name = guider3
+      description = "Images from the WFOS AGWFS 3"
+      channel = viz.wfos.agwfs1
+      format = FITS
+      size = [2048, 2048]
+      pixelSize = 2
+      maxRate = 5.0
+      metadata = [
+        {
+          name = platescale
+          type = float
+          description = "platescale of image in arcsec/pixel"
+          keyword = SCALE
+        }
+        {
+          name = integrationTime
+          type = integer
+          description = "integration time of image in ms"
+          keyword = ITIME
+        }
+      ]
+    }
+  ]
+
+

Other Event Types

+

Some events signal an occurrence of an activity in a component that other systems use to synchronize actions. Some, like observe events, are system defined. They are not periodic, so a rate is not necessary. The publish-model.conf file has a container for events the component publishes that includes an array of one or more events.

+

Current states, which are published by HCDs for assemblies, are not actually events, but are structured the same, and written in the currentStates block instead of the events block.

+

Events and current states have the same schema, with a name, description, and parameters describing the event data. Below is an example current state event described in the publish-model.conf file:

+
  currentStates = [
+    {
+      name = "nacqUnarchived"
+      archive = false
+      parameters = [
+        {
+          name = nacq_detector_state
+          description = "current state of the NACQ detector"
+          enum = [EXPOSING, READING, IDLE, ERROR]
+        }
+        {
+          name = nacq_period
+          description = "NACQ continuous read period"
+          type = float
+          units = seconds
+        }
+        {
+          name = nacq_contRead
+          description = "NACQ continuous read state enabled"
+          type = boolean
+        }
+        {
+          name = nacq_mag_position
+          description = "NACQ magnifier stage motor position"
+          type = float
+          // units = TBD
+        }
+        {
+          name = nacq_position
+          description = "nominal position of the NACQ/NHRWFS stage for the NACQ "
+          // array of 3 floating point numbers in mm
+          type = array
+          dimensions: [3]
+          items = {
+            type = float
+          }
+          units = mm
+        }
+      ]
+    }
+
+

The screenshot below shows part of the PDF display for the above CurrentStates example:

+

+

Service Model File

+

Another optional icd model file is service-model.conf. It is used to describe HTTP services provided by or consumed by a component. The actual HTTP services are described in OpenAPI files that are also stored in the icd database.

+

On the consumer side, the file can indicate which routes of the HTTP service it uses.

+

Here is an example consumer service-model.conf:

+
subsystem = TEST
+component = env.ctrl
+
+requires = [
+  {
+    subsystem = TEST2
+    component = SegmentService
+    name = esw-segment-db
+    // Optional routes / paths used
+    paths = [
+      {
+        path = /setPosition
+        method = post
+      },
+      {
+        path = /currentPositions
+        method = get
+      }
+    ]
+  }
+]
+
+

The above example states that the component uses the HTTP methods POST /setPosition and GET /currentPositions from the service. The paths are optional and just for information. The generated documentation for an ICD between two subsystems or components will only display the parts of HTTP services that are declared as being used (in the paths array). By default, if the paths are not specified, the complete service API will be included in the ICD documentation.

+

In the example service-model.conf file from a service provider below, the line:

+
openApi = esw-segment-db.json
+
+

points to the OpenAPI definition for the HTTP service that is being provided (The OpenAPI file should be in the same directory as the service-model.conf file and can be in JSON or YAML format and have the suffix .json, .yaml or .yml). Both the service-model information and the contents of the OpenAPI file are stored in the icd database where they are used to produce documentation (YAML files are first converted to JSON).

+

service-model.conf:

+
subsystem = TEST2
+component = SegmentService
+
+provides = [
+  {
+    name = esw-segment-db
+    description = "HTTP API to ESW Segment DB service, used for keeping track of TMT mirror segments"
+    openApi = esw-segment-db.json
+  }
+]
+
+

The screenshot below shows how the above service provider info is displayed in the icd web app:

+

+

If you click on the small button in the Name column, the detailed display is toggled open or closed. If you click on the link next to it, the documentation for the HTTP service is opened in a new tab. The format of the documentation for HTTP services is different from that of events, since it is provided by the swagger-ui library. The PDF version is somewhat simpler and is provided by the swagger-codegen command line application.

+

Note that each component can declare multiple services consumed and/or provided in the service-model.conf file. You can find example service-model.conf files and OpenAPI files in the examples/3.0 directory in the icd sources.

+

Alarms

+

An alarm is published to mark an abnormal condition that requires attention. Alarms are not errors; they are conditions that occur asynchronously while components are executing or inactive.

+

The alarm feature has been redesigned for the CSW PDR in response to CoDR comments. The structure of the model follows the design of the Alarm Configuration file, which provides a listing of all possible alarms within the Observatory, as well as information for the operator to respond to the alarm.

+

The table below lists the required and optional fields for an alarm definition in alarm-model.conf:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
nameyesName of the alarm, which should be one word.
descriptionyesA description of the alarm including what is the cause and possible response. The description is in triple quotes for multi-lined text. Note that spaces between paragraphs are retained.
requirementsnoList of requirements that flow to this alarm
severityLevelsyesAn array of severity levels that the alarm can have (besides Disconnected, Indeterminate, Okay): Default is any severity. Possible values are: Warning, Major, Critical.
locationyesA text description of where the alarming condition is located
alarmTypeyesThe general category for the alarm: One of: Absolute, BitPattern, Calculated, Deviation, Discrepancy, Instrument, RateChange, RecipeDriven, Safety, Statistical, System
probableCauseyesThe probable cause for each level or for all levels
operatorResponseyesInstructions or information to help the operator respond to the alarm
autoAckyesDoes this alarm automatically acknowledge without operator?
latchedyesDoes this alarm latch?
+

Below is an example alarm-model.conf file:

+
subsystem = TEST
+component = env.ctrl
+
+alarms = [
+    {
+      name = limit
+      description = "The NGS FSM stage has reached a limit. It is not possible to position the FSM."
+      requirements = [TBD]
+      severityLevels = [Major]
+      location = "NGS FSM stage"
+      alarmType = System
+    probableCause = "The PFSM HCD was commanded without the knowledge of the assembly, or the configured soft limits are incorrect"
+      operatorResponse = "Execute the datum command"
+      autoAck = false
+      latched = true
+    }
+  ]
+
+

The PDF output generated from this part of the alarm-model.conf file is shown below:

+

Note
+

In previous icd versions, the alarms were listed in the publish-model.conf file and this is still supported for backward compatibility.

+

Subscribe-model

+

The subscribe-model.conf file lists the event information a component subscribes to from other components. The subscribe-model.conf file is simpler than the publish-model.conf file, containing only references to the published items.

+

Like publish-model.conf, the subscribe-model.conf file includes sections for each of the kinds of events or images that are available: events, observeEvents, images and currentStates. Each section is an array of items with the same fields as shown in the table below. Only the subsystem, component, and name fields are required.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired? Notes
subsystemyesName of the publisher’s subsystem.
componentyesName of the component publishing the item.
nameyesThe simple name of the item such as: zenithAngle.
usagenoDescribes how the item is being used by the subscriber
requiredRatenoThe rate the subscriber needs updates of the item in order to operate properly (in Hz). This may not be the rate that the publisher publishes.
maxRatenoThe maximum rate at which the subscriber can process the item (in Hz).
+

Below is an example subscribe-model.conf file for an IRIS component called oiwfs_adc_assembly that uses the published data of the TCS.

+
subsystem = IRIS
+component = oiwfs_adc_assembly
+
+subscribe {
+  events = [
+    {
+      subsystem = TCS
+      component = cmIRIS
+      name = oiwfs1AtmDispersion
+      usage = "Atmospheric dispersion stream"
+      requiredRate = 1
+    }
+    {
+      subsystem = TCS
+      component = cmIRIS
+      name = oiwfs2AtmDispersion
+      usage = "Atmospheric dispersion stream"
+      requiredRate = 1
+    }
+    {
+      subsystem = TCS
+      component = cmIRIS
+      name = oiwfs3AtmDispersion
+      usage = "Atmospheric dispersion stream"
+      requiredRate = 1
+    }
+    {
+      subsystem = IRIS
+      component = oiwfs_poa_assembly
+      name = POS_current
+      usage = "Current OIWFS probe rotations needed to set correct ADC orientations"
+    }
+    {
+      subsystem = NFIRAOS
+      component = rtc
+      name = oiwfsImage
+      usage = "OIWFS ellipticity correction stream for ADCs"
+    }
+  ]
+}
+
+

Events have been redesigned for the CSW PDR. Components write their data and other systems sample it at the rate they need. requiredRate allows a component to state a rate they require to operate properly. It’s up to the publisher to make sure that they can provide that rate. This is part of checking interfaces.

+

There is minimal documentation for subscribe items. The full description of an item belongs with the publisher, not the subscriber. The subscriber is only referencing its use of information published by another component.

+

The name field must match the name of published item in another component. It must be spelled correctly. The best way is to browse the API of the source system and copy the full path.

+

By default, subscribed events are not displayed in API documents. To include them, pass the –clientApi option to icd-db, or select the Include client API information check box in the web app.

+

The figure below shows a section of the display of the icd web app for the above subscribe-model.conf file. The descriptions are looked up in the database (originally from publish-model.conf files in other components).

+

+

See also the example subsystems in the icd GitHub repo that show the different types of events and images used in the subscribe-model.conf files.

+

Command-model

+

The command-model.conf file describes the submit commands the component accepts (receive) and the submit commands it sends to other components it depends on (send). As in other sections, there is a block for the send and receive entries. The required and optional fields of command-model.conf are shown in the table below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
subsystemyesName of the subsystem. Must be the same as SE subsystem name.
componentyesName of the component that uses this command-model.conf file. Should match name used elsewhere.
receiveyesThe block for commands this component supports.
descriptionnoAn optional overall description of the commands received by the component. The description is in triple quotes for multi-lined text.
sendnoThe block for commands this component sends to other components.
+

The receive block holds an array of items that are descriptions of commands the component receives or accepts.

+

The required and optional fields of the receive block are shown in table below.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
nameyesName of the command (appended to prefix).
descriptionyesA description of the command.
requirementsnoA list of one or more TMT requirements that are associated with this command.
preconditionsnoList of preconditions for this command, including safety.precautions. Unless otherwise documented, it is assumed that the conditions ALL need to be met.
postconditionsnoList of postconditions for this command, including safety precautions. Unless otherwise documented, it is assumed that the conditions ALL need to be met.
requiredArgsnoA list of command arguments (parameters) that are required.
parametersnoThe block for arguments the command supports. Parameters are as described for events.
completionTypenoIndicates the completion type of a command: See CSW CommandService API for details. Possible values: immediate, longRunning, oneway (default: immediate).
resultTypenoDefines a list of parameters in the result (For commands that return a result) in the same format as the command parameters.
completionConditionnoFor oneway commands, a list of conditions (string text) for determining command completion (if applicable). Unless otherwise documented, it is assumed that the conditions ALL need to be met.
rolenoThe user role required in order to execute this command (one of: eng, admin or user). Some commands may be protected and only allowed for engineering or admin users. The default required role is a regular user role.
+

The contents of the parameters and resultType containers are parameters as described for events in a previous section.

+

The send block contains a list of commands this component sends to other components. The required fields for each item in the list are shown in the following table.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldRequired?Notes
subsystemyesThe TMT subsystem for the component that receives the command
componentyesName of the component that receives the command. Should match name used elsewhere.
nameyesname of the command
+

An example of the beginning and the receive block from a command-model.conf file for is shown below.

+
subsystem = TEST
+component = lgsWfs
+
+description = "Example Commands …"
+
+receive = [
+  {
+    name = LGS_WFS_INITIALIZE
+    description = """
+       |LGS_WFS_INITIALIZE command will:
+       |* disable the LGS WFS engineering continuous read mode (if required)
+       |* (re)connect to the LGS WFS HCD
+       |* set LGS WFS exposure parameters to default values
+    """
+    requirements = ["INT-TEST-AOESW-1000"]
+    parameters = [
+      {
+        name = wfsUsed
+        description = "OIWFS used"
+        type = string
+      }
+    ]
+    completionType = oneway
+    completionCondition = [
+      "List of conditions to meet for oneway command to be complete...",
+      "condition two",
+      "condition three"
+    ]
+  }
+]
+
+

The resulting PDF display for the above model file is shown in the screenshot below.

+

+

The send container documents the configuration commands one component sends to another. This allows mapping the command flow in the system and dependencies between components. The name of the configuration command, the component and the subsystem are enough to identify the destination of the configuration command.

+

The example send container section of the command-model.conf file for the TCS Corrections assembly is shown below.

+
send = [
+  //*******
+  // cabinet-environment assembly
+  {
+    name = GLY_init
+    subsystem = IRIS
+    component = cabinet_environment_assembly
+  }
+  {
+    name = GLY_test
+    subsystem = IRIS
+    component = cabinet_environment_assembly
+  }
+  {
+    name = TEMP_init
+    subsystem = IRIS
+    component = cabinet_environment_assembly
+  }
+  {
+    name = TEMP_test
+    subsystem = IRIS
+    component = cabinet_environment_assembly
+
+

The generated HTML output from the above send section of the command-model.conf file is shown below. The description and other details are taken from the publish information in the database.

+

Note
+

By default, sent commands are not displayed in API documents. To include them, pass the –clientApi option to icd-db, or select the Include client API information check box in the web app.

+
+ + +
+
+
+
+ + +
+ + + + + + + + diff --git a/paradox.json b/paradox.json new file mode 100644 index 0000000000..887dd3ec75 --- /dev/null +++ b/paradox.json @@ -0,0 +1,4 @@ +{ + "name" : "docs", + "version" : "3.1.0" +} \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000000..edb67407ef --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"docs":[{"location":"/paradox.json","text":"","title":""},{"location":"/index.html","text":"","title":"Interface Database System (IDBS)"},{"location":"/index.html#interface-database-system-idbs-","text":"Introduction Background Design Background Overview icd-db icdwebserver icd-git icd-viz icd-fits Implementation Details IDBS Workflow and Creating ICDs Installing IDBS Installing the Binary Release Installing the Source Release Installing MongoDB Model Files Markdown Support, Math, UML, Dot Inner-Document Links Reusing Definitions for Events, Commands, Parameters (refs) Using Jsonnet for Model Files Subsystem-model Optional $subsystem-icd-model file Component-model Parameters, Types and Units FITS Keywords Parameter Types Units Parameter Examples Publish-model Events Observe Events Images Other Event Types Service Model File Alarms Subscribe-model Command-model Using the icd-db command line app Generating Documents and Code from the ICD Database Using the icd-fits command line app FITS Keywords Generating a Document listing the FITS Keywords Using the Web Interface Starting the icd web app Upload Files Procedure for Uploading Files View a Subsystem API Check for Missing Items Generate Source Code from the ICD Database View API History Create and View an ICD View ICD History Print an ICD or API View a Graph of Component Relationships","title":"Interface Database System (IDBS)"},{"location":"/idbs/introduction.html","text":"","title":"Introduction"},{"location":"/idbs/introduction.html#introduction","text":"The Interface Database System (IDBS) was created to help component builders and system engineering understand the programming interfaces of software components created with the TIO Common Software.","title":"Introduction"},{"location":"/idbs/introduction.html#background","text":"The project was started for the following purposes:\nTo document the interfaces of components based on TIO Common Software in the TIO Software System. To support a more agile development process by tracking changes to component interfaces over the course of TMT construction. To understand how events are used in the software system. To support the Systems Engineering change control process by understanding how planned interface changes influence the software system. To understand the software interfaces between subsystems and components in the software system. To decrease the workload of developers by generating API and ICD documentation that can be used for reviews. Provide a platform for understanding and modeling the interactions of components during observing. This might include adding additional information to the models.","title":"Background"},{"location":"/idbs/introduction.html#design-background","text":"There might be several ways to solve the problems IDBS is addressing. One approach might be to use/extend a source code documentation markup tool such as Doxygen or the 15+ other products a Google search on software documentation shows. The reason this approach wasn’t taken is that the problem is not about documenting source code, it is modeling components and interfaces and delivering a database that provides a basis for understanding and tracking interfaces and their changes. The models need to drive the source, not the other way around. Documentation tools can generate documents but extracting information and putting it into a database is not the scope of these tools. The primary need is to have a database of interfaces and delivering interface documentation is a second, although important, side effect. Ultimately, it is a question of how to best describe a component and its interfaces.","title":"Design Background"},{"location":"/idbs/overview.html","text":"","title":"Overview"},{"location":"/idbs/overview.html#overview","text":"The IDBS software currently consists of the following programs:\nicd-db icd-git icd-viz icd-fits icdwebserver\nThe components of the Interface Database System are shown below. They are briefly described here, with more details provided in subsequent sections.\nThe workflow proceeds from left to right.\nThe TIO developer, using Common Software for his/her components, creates component model files. These files are validated and ingested into the ICD Model File Database using either the icd-db command or a web application called icdwebserver. These were developed to work with the ICD Model File Database and provide the functionality the users of the system need. The model files are stored and published in Git repositories on GitHub. The icd-git application can be used to sync the local database with the published versions on GitHub. The icd web app also gets its information from the published versions on GitHub, in addition to any unpublished versions that a developer is working with locally. The icd-viz command line application can be used to generate a graph of component or subsystem relationships. This feature requires that graphviz is installed and is also available in the icd web app. The icd-fits command can be used to view information about FITS keywords and their source events.","title":"Overview"},{"location":"/idbs/overview.html#icd-db","text":"The icd-db program exists to validate and ingest model files into a local ICD Model File Database. When creating or modifying the models, this feature can be used to incorporate working versions of the files into the database system. The icd-db program also allows some informative queries to be performed directly on the database, showing what subsystem and components exist in the database, and information about them such as data rates, data types, and units used. Note that these operations only work on the models that exist in the local version of the database, and do not access the released models on the GitHub repository.","title":"icd-db"},{"location":"/idbs/overview.html#icdwebserver","text":"The icdwebserver web application provides the IDBS user application interface. The browser-based user interface allows the ingesting of model files, publishing them, and displaying versioned APIs for each component. An API is defined as all the functionality of a component or subsystem including inputs and outputs. An ICD is produced by taking the intersection of two subsystem API documents.\nThe IDBS browser provides the ability to browse the APIs for both published and unpublished models. The published APIs are constructed from models obtained from the git repository which stores the released versions, and the unpublished APIs are constructed by accessing the models stored in the local database that have been ingested using the icd-db program or the web app.\nThe current version of the IDBS browser user interface includes the following features:\nAllows browsing all the subsystems and their components (including previously published versions as well as unpublished working versions). View the API for a subsystem or an individual component. Browse interfaces between subsystems, or components within subsystems. Upload directories containing the model files for a subsystem API Publish APIs and ICDs (if enabled, for TIO SE use only) Print ICD or API information from the browser (using browser print). Export an API or ICD as a PDF document. Show the publish history of an API or ICD and compare the differences between versions Generate a PDF document that shows the amount of storage required for all archived events Generate a graph of component or subsystem relationships\nA public (password-protected) ICD web service has been set up that allows users to view the APIs and ICDs of all TIO subsystems and components. The uploading functionality of this web service has been disabled; new model files must be committed to the GitHub repository to add new versions to this system, which are automatically added to the web service whenever the system is refreshed. Log-in credentials can be obtained from Systems Engineering. This web service is located at: https://sdb.tmt.org/.","title":"icdwebserver"},{"location":"/idbs/overview.html#icd-git","text":"The icd-git application is a command line tool that can be used to update your local icd database with the published versions from GitHub (Use: icd-git --ingest). Otherwise, this application is primarily meant to be used by systems engineering to manage official releases of APIs and ICDs by interacting directly with versions of subsystem model files as maintained by the official GitHub repository (http://github.com/tmt-icd). Since this tool is mainly intended to be used by the Systems Engineering group, it is not documented here.\nIt is also possible to publish APIs and ICDs using the web app (icdwebserver) and this is now the preferred way to do it. The API publishing features of the web app are protected by password and only enabled for use by those with permission to push to the GitHub repository that holds that information.","title":"icd-git"},{"location":"/idbs/overview.html#icd-viz","text":"The icd-viz command line application generates a graph of the relationships of given components or subsystems. There are a number of options for controlling what is displayed and the format of the image produced.\nThis application relies on graphviz to generate the graph from a description generated in the dot graph description language. Run icd-viz –help to see the command line options (These are also listed in the README.md file for the icd-viz subproject on GitHub). Note that the icd web app also provides a user interface for most of these features. See Using the Web Interface for more information on that.\nThe icd-viz command lets you specify one or more TIO components or subsystems (in which case all components in the subsystem are used). These are the primary nodes of the graph, drawn as solid ovals. Then, all of the components that publish events for these components or subscribe to events from these components are added to the graph (as dashed ovals). The graph edges indicate the flow of events and commands between the components and optionally show any errors, such as events subscribed from publishers that do not exist, or published events with no subscribers.\nThe default colors used for the graph can be found in icd/icd-viz/src/main/resources/reference.conf and can also be overridden with a command line option like -Dicd.viz.color.IRIS=darkgreen (replace IRIS with the subsystem). The colors should be valid Graphviz colors.\nNote The design of the icd-viz application is based on previous work (NIC/scripts/icdRelationships.py) from Ed Chapin of the NRC.\nExample icd-viz command line usage:\nPlot all interfaces for a particular component to the screen, label events and commands, and show missing events and commands:\nicd-viz --components iris.oiwfs.poa --missingcommands true --missingevents true --commandlabels true --eventlabels true\nBelow is the resulting image from the above command:","title":"icd-viz"},{"location":"/idbs/overview.html#icd-fits","text":"The icd-fits command line application can be used to manually ingest FITS dictionary files into the icd database and produce tables in PDF and other format containing information about all the FITS keywords and the subsystem events that are the source of the keyword values. There are command line options that allow you to filter the list of keywords by source subsystem and component as well as by tag.\nThe command can also be used to merge the FITS keyword definitions found in the publish model files with the current FITS dictionary stored in the icd database to produce a new FITS dictionary, where the keyword definitions in the publish model files override the ones previously in the FITS dictionary. This can be used to update the FITS-Dictionary.json file in the tmt-icd DMS-Model-Files GitHub repository, which is loaded automatically whenever the DMS model files are ingested into the icd database.\nThe main source for the FITS dictionary files is in the FITS-Dictionary directory in the tmt-icd DMS-Model-Files GitHub repository. One file there, FITS-Dictionary.json, lists information about the FITS keywords and related subsystem, component, event, and parameter. Another file, FITS-Channels.conf, lists the available channel names for FITS keywords that have multiple source events or parameters. The third file, FITS-Tags.conf, assigns tags to the keywords, such as SL (Seeing-Limited), DL (Diffraction-Limited), or the WFOS, IRIS or MODHIS instruments.\nSome keywords can come from multiple sources or channels, such as imaging or IFS. This information is also included in the FITS Dictionary JSON file above. When you specify the FITS keyword in an event’s parameter description in publish-model.conf, in most cases it is enough to just list the keyword name with keyword = keyname. If the same FITS keyword has multiple different source events/parameters, it needs to be assigned a channel as well. For example: channel = IFS. The channel name needs to be one of the predefined names for that subsystem listed in FITS-Channels.conf.\nFor more details, see Using the icd-fits command line app.\nNote that at the time of writing these files are still in development and may contain incorrect information.","title":"icd-fits"},{"location":"/idbs/overview.html#implementation-details","text":"The IDBS is implemented in Scala, a JVM-based language (http://www.scala-lang.org). The web application is developed using Play (https://www.playframework.com). These are tools selected for OSW and CSW. The ICD information is stored in a document database called MongoDB (https://www.mongodb.org).\nThe code is available on GitHub at: https://github.com/tmtsoftware/icd.","title":"Implementation Details"},{"location":"/workflow/workflow.html","text":"","title":"IDBS Workflow and Creating ICDs"},{"location":"/workflow/workflow.html#idbs-workflow-and-creating-icds","text":"This section describes how the IDBS fits into the software development process at TMT. This workflow is shown in the context of the TMT Software Quality Assurance Plan and Software Development Process (SQUAP and SDP) [RD01], which describes the entire software development process.\nOMOA components consist of HCDs, Assemblies, Sequencers, and Applications. The components are developed incrementally and independently of other subsystem’s components.\nEach component has a public interface or application programming interface (API). The API is based on the services provided by common software. The API shows all the available functionality of a component and subsystem.\nEach TIO software ICD consists of a framework part and a detailed part. The framework part is written in Word according to the TIO Systems Engineering template. The detailed part is generated from the ICD-DB and can change more frequently without requiring updates to the framework document - at least in the case where the framework information does not change.\nA component developer creates a set of model files for each component that describes the component and its interfaces (see the section on model files). These model files are text files. When the component interface changes, the developer updates the model files, validates them, and when ready, checks them into a dedicated repository for model files at the GitHub site: (https://github.com/tmt-icd).\nWhen working on or changing an interface used by another TIO subsystem that will be part of an ICD, the component developer should work with the other subsystem developers to determine the correct functionality and API.\nOnce the model files are checked in, TIO Systems Engineering determines when the new version of a subsystem’s API can be published and given a new incremental version number. Systems Engineering will review any changes that impact other subsystems and ensure they are aware of and agree with changes that will be part of an ICD. New releases of the API documents can be published and will be seen as published in the ICD-DB web user interface.\nTIO Systems Engineering also determines when a new ICD can be generated based on the APIs of the constituent subsystems and manages the publication of a new detailed ICD release. When published, the new ICD is also shown as published in the ICD-DB web user interface.\nNote It may be necessary to click the browser refresh button to see a newly published API or ICD that is not yet in the local icd database (The icd web app then automatically ingests any newly published APIs and ICDs into the local database). The command icd-git –ingest will also update the local database from the released versions on GitHub.","title":"IDBS Workflow and Creating ICDs"},{"location":"/installing/installing.html","text":"","title":"Installing IDBS"},{"location":"/installing/installing.html#installing-idbs","text":"While the public ICD web service can be useful for browsing existing APIs, it can be easier to develop model files by using the IDBS system locally. The icd-db and icdwebserver programs are useful for the developer in order to validate and ingest model files into the local ICD database. The ICD software can be installed on any machine with a Java JDK version of 17 or greater. The details of installing Java on a system are not covered here (Java 17 was used for testing).\nThe following external applications are also required at runtime: * graphviz – The dot command is required to generate graphs and for inline UML support. * swagger-codegen – Required for documenting HTTP services (at least version 3.0.36, install with cs install --contrib swagger-codegen) * mongodb – Required for the database that stores the API information (see below) * jsonnet - Required to process model files written in the jsonnet language\nThe following applications are optional and used if present to fomat generated source code: * scalafmt - Used to format generated Scala source files (Install with cs install scalafmt) * google-java-format - Used to format generated Java source files * black - Used to format generated Python source files * prettier - Used to format generated Typescript source files","title":"Installing IDBS"},{"location":"/installing/installing.html#installing-the-binary-release","text":"Binary releases of IDBS are available on GitHub at:\nhttps://github.com/tmtsoftware/icd/releases\nPlease download the most recent release. The file is available as a zip file. It can be unpacked on Mac or Linux with:\nunzip idbs-$version.zip\nwhere $version is the release version.\nOnce the installation is unpacked it creates a directory named idbs-$version that contains three subdirectories: bin, conf, and lib. Inside bin are the application scripts: icd-db, icd-git, icd-viz, icd-fits and `icdwebserver.\nThe image below shows the basic directory structure of the IDBS binary distribution downloaded from GitHub:\nThe icd-db or icdwebserver program is needed to validate and ingest the directories containing your model files. You might want to put the idbs-$version/bin directory in your shell path.","title":"Installing the Binary Release"},{"location":"/installing/installing.html#installing-the-source-release","text":"The source for the IDBS programs can be downloaded from the tmtsoftware GitHub repository with the command:\ngit clone https://github.com/tmtsoftware/icd.git\nThe git clone command will result in a local directly called icd. An install.sh script is provided that builds and installs all the subprojects into a directory called install_icd in the parent directory of the download directory (the ../install_icd directory). The install_icd directory contains the directories: bin, conf, and lib. Inside the bin directory are Linux/Mac friendly scripts to start the components of IDBS.\nThe code is built with the sbt build program, which must be downloaded and installed (see http://www.scala-sbt.org). That task is not covered here. The “All Platforms” or “Manual installation” is quick, which is the suggested approach.\nThe icdwebserver application starts the web application (by default on localhost:9000).","title":"Installing the Source Release"},{"location":"/installing/installing.html#installing-mongodb","text":"In order to run the icd applications locally, it is necessary to install the database MongoDB, which is available at https://www.mongodb.org. The community edition is sufficient for our needs and instructions for installation can be found for a variety of platforms at\nhttps://docs.mongodb.com/manual/administration/install-community/.\nNote that it may be necessary to adjust system limits in order for mongod to run correctly. See\nhttps://docs.mongodb.com/manual/reference/ulimit/.\nNote: If you wish to “start over” with no database entries, you can use the command icd-db –drop db. Run icd-git –ingest to get the published APIs and ICDs from the released versions on GitHub.","title":"Installing MongoDB"},{"location":"/modelFiles/modelFiles.html","text":"","title":"Model Files"},{"location":"/modelFiles/modelFiles.html#model-files","text":"In the OMOA, subsystem software consists of components: Hardware Control Daemons, Assemblies, Sequencers, and Applications. Model files that provide information about the component and its interfaces are created for each of the components. This section describes the model files. The model files are named: component-model, command-model, publish-model, alarm-model, and subscribe-model. In addition, each subsystem has a single subsystem-model file and may have one or more $subsystem-icd-model files that contain additional information about the interface between two subsystems. Separate files were created (rather than one larger file) in order to keep the configuration files simpler and easier to type.\nThe following table shows the different types of model files and what they describe:\nModel File Description subsystem-model.conf Contains high-level information about the subsystem that contains a group of components. There is one subsystem-model.conf file per subsystem. component-model.conf Contains high-level component information. There is one component-model.conf file per component. command-model.conf Describes the configuration commands the component supports. Also describes components and commands the component may send to other components. There is at most one command-model.conf file per component. publish-model.conf Describes events the component publishes using Event Services. There is at most one publish-model.conf file per component. service-model.conf Describes HTTP services provided or consumed by the component. The HTTP services themselves are described in OpenAPI files. alarm-model.conf Describes alarms the component publishes using the Alarm Service. There is at most one alarm-model.conf file per component. subscribe-model.conf Describes events the component subscribes to using Event Services. There is at most one subscribe-model.conf file per component. $subsystem-icd-model.conf Where $subsystem is the name of one of the other TMT subsystems, for example: IRIS-icd-model.conf. These files may contain additional information about the interface between the subsystem being defined and another subsystem (IRIS in this example).\nThe component is only required to create a command-model.conf, publish-model.conf, alarm-model.conf, or subscribe-model.conf if it provides or uses the features described in the model files (i.e. if the component does not subscribe to events, then a subscribe-model.conf file is not needed).\nModel files are text files written in a superset of JSON called HOCON, which provides syntactic sugar for writing JSON, but can be exported as pure JSON. In addition, most fields support GitHub style MarkDown as well as HTML tags. LaTeX math markup and UML are also supported (see below). In addition, it is possible to reuse certain repetitive definitions, such as those for events, commands and parameters by using the ref keyword in the model files to refer to another definition. The syntax is described below. Each type of model file has a schema which specifies the allowed structure of the contents within, including specifying the optional and required items, item types, allowed ranges, etc. The following sections describe each of the model files including necessary fields.","title":"Model Files"},{"location":"/modelFiles/modelFiles.html#markdown-support-math-uml-dot","text":"In addition to using standard GitHub style MarkDown in descriptions, you can also insert LaTeX math formulas: Here is an example description text containing an inline math formula:\ndescription = \"\"\"\nHere is an example using LaTeX math: $`\\frac{d}{dx}\\left( \\int_{0}^{x} f(u)\\,du\\right)=f(x)`$.\nAnd here is another: $`[x^n + y^n = z^n]`$.\n“””\nAnd this is the inline math formula displayed from the above input:\nBlock math formulas are delimited by\n```math\n\n```\nFor example:\nDescription = “””\nHere is an example using LaTeX math: $`\\frac{d}{dx}\\left( \\int_{0}^{x} f(u)\\,du\\right)=f(x)`$.\nAnd here is another: $`[x^n + y^n = z^n]`$.\n\nThis is a math block:\n\n```math\n$$\\idotsint_V \\mu(u_1,\\dots,u_k) \\,du_1 \\dots du_k$$\n```\n\nand another:\n\n```math\n\\frac{n!}{k!(n-k)!} = \\binom{n}{k}\n```\n\nand a matrix:\n\n```math\nA_{m,n} =\n \\begin{pmatrix}\n a_{1,1} & a_{1,2} & \\cdots & a_{1,n} \\\\\n a_{2,1} & a_{2,2} & \\cdots & a_{2,n} \\\\\n \\vdots & \\vdots & \\ddots & \\vdots \\\\\n a_{m,1} & a_{m,2} & \\cdots & a_{m,n}\n \\end{pmatrix}\n```\n“””\nThe display for the above description is shown below:\nUML (PlantUML) and Graphviz Dot are also supported, delimited by\n```uml\n```\nFor example, below are some embedded UML blocks in a model file description text:\nDescription = “””\n\nand a small one:\n\n```uml\nBob -[#red]> Alice : hello\nAlice -[#0000FF]->Bob : ok\n```\n\nNote that according to https://plantuml.com/dot you can also use Graphviz/Dot diagrams instead of UML:\n\n```uml\ndigraph foo {\n node [style=rounded]\n node1 [shape=box]\n node2 [fillcolor=yellow, style=\"rounded,filled\", shape=diamond]\n node3 [shape=record, label=\"{ a | b | c }\"]\n\n node1 -> node2 -> node3\n}\n```\n\"\"\"\nBelow is the display produced from the above description text:","title":"Markdown Support, Math, UML, Dot"},{"location":"/modelFiles/modelFiles.html#inner-document-links","text":"It is possible to make inner-document links to existing anchors using Markdown syntax. The easiest way to see the syntax for the ids is to look at the generated HTML. For example, the output of:\nicd-db -s NFIRAOS -o NFIRAOS.html\nNote that the name attribute is used in the generated HTML instead of id, since the PDF generator required that. Many of the anchors have the following syntax:\naction-subsystem.name\nwhere\n$thisComponent is the component being described $action is one of {publishes, subscribes, sends, receives} $itemType is one of {Event, ObserveEvent, Alarm, Command} $subsystem is the subsystem for the item $component is the component for the item $name is the name of the item being published, subscribed to, or the command being sent or received\nFor example, to link to the description of a published event named heartbeat in the lgsWfs component in the TEST subsystem:\nSee: [here](#lgsWfs-publishes-Event-TEST.lgsWfs.heartbeat).","title":"Inner-Document Links"},{"location":"/modelFiles/modelFiles.html#reusing-definitions-for-events-commands-parameters-refs-","text":"It is possible to reuse similar parts of event, command and parameter definitions by using the ref keyword. The example below uses a reference to an event (engMode) in another event (engMode2):\nevents = [\n {\n name = engMode\n description = \"LGS WFS engineering mode enabled\"\n archive = false\n parameters = [\n ...\n ]\n }\n {\n name = engMode2\n description = \"LGS WFS engineering mode 2 enabled\"\n archive = true\n ref = engMode\n }\nIn the above example, the event engMode2 will have the same settings and parameters as engMode, except for description and archive, which are overridden. Any fields, which are not set, are inherited from the referenced event. This works for events, commands and parameters, as shown in the parameter reference example below:\nparameters = [\n {\n name = mode3\n ref = engMode/parameters/mode\n }\nIn the above example, the parameter mode3 will be exactly the same as the mode parameter in the engMode event in the same component. You could also specify a different description field or any other parameter fields that should override the ones defined for mode.\nThe syntax of the ref value is flexible and allows you to reference any event, command or parameter in any component within the same subsystem. You can use a full path to specify a reference to an item in another component, or an abbreviated path for items in the same scope. The full syntax of a ref is something like this:\ncomponentName/section/eventName[/parametersSection/paramName]\nFor example, to reference an event, observe event or current state, use:\ncomponentName/events/eventName or componentName/observeEvents/eventName or componentName/currentState/eventName or events/eventName, … (if in the same component) or just eventName (if in the same component and event type section) For commands received, the syntax is similar: componentName/receive/commandName or just commandName (if in the same component)\nThe syntax for references to parameters of events adds the parameters keyword and the parameter name:\ncomponentName/events/eventName/parameters/paramName\nor abbreviated as described above for events:\nobserveEvents/eventName/parameters/paramName (in same component) or eventName/parameters/paramName (in same component and events section)\nOr just paramName (if in the same parameters section)\nThe syntax for parameters of commands is similar. Here you need to specify if the parameters appear in the “parameters” section or in the “resultType”.\ncomponentName/receive/commandName/parameters/paramName or componentName/receive/commandName/resultType/paramName\nOr abbreviated as described above.\nSee the example model files in the icd sources for some examples of the ref keyword.\nNote If there is an error in the reference, the error message is displayed in the log output of the icd-db command, if it is used, and also inserted in the generated HTML or PDF document (in the details section).\nBelow is an example that demonstrates some of the ref syntax for event parameters:\nevents = [\n {\n name = engMode3\n description = \"LGS WFS engineering mode enabled 3\"\n archive = true\n parameters = [\n {\n // Example reference to a parameter in this component\n name = mode3\n ref = engMode/parameters/mode\n }\n {\n // Example reference to a parameter in this component (using wrong ref to produce error in HTML/PDF output)\n name = mode3Error\n ref = engMode/parameters/modeXXX\n }\nNote Note: An earlier version of the icd software used the terms “attributes” for events parameters and “args” for command parameters. These have been renamed to “parameters” for compatibility with CSW, however for backward compatibility the previous names are also allowed in refs.","title":"Reusing Definitions for Events, Commands, Parameters (refs)"},{"location":"/modelFiles/modelFiles.html#using-jsonnet-for-model-files","text":"Normally, the icd model files are written in HOCON format, a simplified JSON format, and have a .conf suffix. In some cases, you may want to have more features available, for example to refer to similar definitions in may different places. The icd software also supports model files using the jsonnet data templating language, which lets you define variables and functions and reuse them. To do this, replace the .conf suffix with .jsonnet (or .libsonnet for jsonnet files you want to import) and follow the syntax rules for jsonnet, so that the resulting JSON, after being processed by jsonnet conforms to the icd JSON schema. The icd software will automatically preprocess the jsonnet model files when they are imported into the icd database.\nFor example, you can add some common, reusable, top level definitions in a file utils.libsonnet:\n// Define a common event\n{\n heartbeat: {\n name: 'heartbeat',\n description: 'Heartbeat event description...',\n parameters: [\n {\n name: 'heartbeat',\n description: 'software heartbeat',\n type: 'integer',\n },\n ],\n },\n\n // Defines a function to generate a common event model based on the given arguments\n commonEventFunc(eventName, paramName, typeName):: {\n name: eventName,\n description: eventName + ' description.',\n archive: false,\n parameters: [\n {\n name: paramName,\n description: 'Description for ' + paramName,\n type: typeName,\n },\n ],\n },\n}\nAnd then reference these definition in a publish-model.jsonnet file for a different component. Below is an example publish-model.jsonnet file that imports reusable jsonnet code:\n// Import common function defined in another file\nlocal utils = import '../utils.libsonnet';\n\n{\n subsystem: 'TEST',\n component: 'jsonnet.example',\n\n // comments can use // or #\n publish: {\n description: |||\n Multi-line descriptions\n use this syntax in jsonnet\n |||,\n\n events: [\n // define two similar events using imported function\n utils.commonEventFunc('myEvent1', 'param1', 'boolean'),\n utils.commonEventFunc('myEvent2', 'param2', 'string'),\n\n // Insert an imported event definition\n utils.heartbeat,\n\n // define another event\n {\n name: 'state',\n // Import the description text\n description: importstr '../importRaw.txt'\n,\n archive: false,\n parameters: [\n {\n name: 'state',\n description: 'Detector state',\n enum: ['EXPOSING', 'READING', 'IDLE', 'ERROR'],\n },\n ],\n },\n ],\n },\n}\nThe above example defines two events (myEvent1 and myEvent2) that are similar, but configured based on the given function arguments. The heartbeat event is used as is. The state event is defined in the usual way (for JSON), but imports the description text from a file.","title":"Using Jsonnet for Model Files"},{"location":"/modelFiles/modelFiles.html#subsystem-model","text":"The subsystem model describes the overall subsystem. There is one subsystem-model.conf file for each subsystem.\nEach subsystem may consist of several components. The IDBS merges them to create a subsystem API or ICD.\nAs an example, the subsystem-model.conf JSON schema file is shown below. This schema file is being shown for reference. Users are not expected to interact with the schema files directly, but rather use this manual to understand how to structure their model files.\nsubsystem-model.conf JSON schema:\nid: \"http://csw.tmt.org/subsystem-schema#\"\n\"$schema\": \"http://json-schema.org/draft-07/schema#\"\n\ndescription = \"Defines the model describing a top level subsystem\"\ntype = object\nadditionalProperties: false\nrequired = [modelVersion, subsystem, title, description]\nproperties {\n _id {\n description = \"Optional unique id (automatically generated)\"\n type = string\n }\n _version {\n description = \"Optional version (automatically generated)\"\n type = integer\n }\n modelVersion {\n description = \"The version of the model file as Major.Minor version\"\n type = string\n pattern = \"^[0-9]+\\\\.[0-9]+$\"\n }\n subsystem {\n description = \"The name of this Subsystem\"\n include classpath(\"3.0/subsystem.conf\")\n }\n title {\n description = \"The title of this subsystem, for display\"\n type = string\n }\n description {\n description = \"A description of this subsystem\"\n type = string\n }\n}\nThe line starting with required = shows the required fields in the subsystem.conf file are: modelVersion, subsystem, title, and description. The following lines in the schema file describe each of the fields. Note also that modelVersion requires a pattern given by a regular expression. The modelVersion must be a value like Major.Minor with at least 1 digit on each side of the period such as 3.0 (The latest version).\nThe fields for subsystem.conf are shown in the table below. The field name, whether it is required, and any special notes for the field are shown. Notes include required formats or conventions for a value.\nRequired and optional fields for subsystem.conf:\nField Required? Notes modelVersion yes Must be a Major.Minor version with Major and Minor digits. Currently these values are supported: 1.0, 2.0, 3.0 (the latest version). subsystem yes Name of the subsystem. Must be the same as SE subsystem name. title yes The title of the subsystem. Will be displayed in generated documents. The title can contain spaces and other marks but should be one line. description yes A description of the subsystem. The description is in triple quotes for multi-lined text. Note that spaces between paragraphs are retained and the text can contain GitHub flavored Markdown as well as HTML markup.\nThe modelVersion is the model version for the entire subsystem. Each component also has a modelVersion field. This allows each component to be updated independently and then the subsystem to be updated as a whole.\nThe subsystem field is the subsystem name. It must be one of the subsystem abbreviations from the SE N2 document. The list is shown below.\n// Enumeration including all available subsystems\nenum = [\n ENC, // Enclosure\n SUM, // Summit Facilities\n STR, // Structure\n M2S, // M2 System\n M3S, // M3 System\n CLN, // Mirror Cleaning System\n TINS, // Test Instruments\n TCS, // Telescope Control System\n M1CS, // M1 Control System\n APS, // Alignment and Phasing System\n OSS, // Observatory Safety System\n ESEN, // Engineering Sensor System\n NFIRAOS, // Narrow Field Infrared AO System\n NSCU, // NFIRAOS Science Calibration Unit\n LGSF, // Lasert Guide Star Facility\n AOESW, // AO Executive Software\n CRYO, // Cryogenic Cooling System\n IRIS, // InfraRed Imaging Spectrometer\n MODHIS, // Multi-Object Diffraction-limited High-resolution Infrared Spectrograph\n REFR, // Refrigeration Control System\n WFOS, // Wide Field Optical Spectrometer\n CIS, // Communications and Information Systems\n CSW, // Common Software\n DMS, // Data Management System\n ESW, // Executive Software System\n SOSS, // Science Operations Support System\n DPS, // Data Processing System\n SCMS // Site Conditions Monitoring System\n]\nThe example below will create a TCS subsystem. The description comes from the text of the TCS CoDR software design document. Triple quotes allow multi-line entries.\nsubsystem=TCS\ntitle=\"TELESCOPE CONTROL SYSTEM (TCS)\"\nmodelVersion=\"3.0\"\ndescription=\"\"\"\nThe main functions of the TCS are: \n1) Points and tracks targets in various reference frames by generating position demands for subsystems and instruments. Generates pointing models to remove repeatable mechanical errors and applies pointing models terms to correct mount demands.\n2) Implements a key part in acquisition, guiding and wavefront sensing \n…\n\"\"\"","title":"Subsystem-model"},{"location":"/modelFiles/modelFiles.html#optional-icd-model-file","text":"There may be zero or more of these model files in the top level directory (which also contains subsystem-model.conf). Replace $subsystem with the name of the other subsystem that has an interface with the one being defined. For example, if you are defining the NFIRAOS subsystem model files and want to include extra information about the ICD between IRIS and NFIRAOS, you could add a file named IRIS-icd-model.conf:\nsubsystem = NFIRAOS\ntitle = \"Interface between NFIRAOS and IRIS\"\ndescription = \"\"\"\nThe communication, software and control interfaces between NFIRAOS and IRIS consist of the following:\n* Transfer of pixel compression gain and offset coefficients from the OIWFS detector controller to the NRTC.\n* Transfer of pixel compression gain and offset coefficients from the IRIS Imager detector controller to the NRTC.\n* Transfer of residual field rotation angle OIWFS from the NFIRAOS RTC to the IRIS SRO.\n* Transfer of the IRIS OIWFS ADC ellipticity correction streams from the NFIRAOS RTC to the IRIS SRO. The corrections include the widths of the elliptical Gaussian image and angle between the ellipse axis and the local X axis.\n* Transfer of the IRIS OIWFS pixels from the IRIS OIWFS detector controllers to the NFIRAOS RTC.\n* Transfer of the IRIS ODGW pixels from the IRIS detector controllers to the NFIRAOS RTC.\n* Transfer of probe position errors due to TT offloading from the NFIRAOS RTC to the IRIS SRO.\n* Transfer of the NFIRAOS Optical Enclosure state to the OIWFS Enclosure.\n* Bi-directional sharing of respective temperatures of NFIRAOS and OIWFS enclosures\n* Transfer of NFIRAOS configuration, state, and performance information to the IRIS Data Reduction System (DRS).\n\"\"\"\nThe fields in the $subsystem-icd-model.conf file are shown below:\nField Required? Notes subsystem yes Name of the subsystem being defined (same as in subsystem-model.conf) title no Optional title to be displayed before the description (If missing, a default title will be used) description yes Text describing the interface between the two subsystems (may include Markdown, HTML) targetSubsystem no Name of the other subsystem that has an interface with this one (Defaults to the one in the file name)","title":"Optional $subsystem-icd-model file"},{"location":"/modelFiles/modelFiles.html#component-model","text":"There is one component-model.conf file for each component in the subsystem. The component model file provides high level information about the component. The fields of the component-model.conf are shown in the following table:\nField Required? Notes modelVersion yes This is the modelVersion for a single component. It must be a Major.Minor version with Major and Minor digits (1.0, 2.0 and 3.0 are currently supported). subsystem yes Name of the subsystem the component belongs to. It must be an entry from the SE subsystem list. wbsId no The WBS element from the cost book this component belongs to such as: TMT.TEL.CONT.TCS. componentType yes Must be: Assembly, HCD, Sequencer, Application, or Container component yes The name of the component. Will be displayed in documents. The component name may contain spaces and dots, but, as of modelVersion 2.0, not a dash “-“. The prefix for a component, which is needed to subscribe to events, is defined as subsystem.component. title yes The title of the component. Will be displayed in documents. The title can include spaces but should be one line. description yes A description of the component (may contain Markdown or HTML markup). The description is in triple quotes for multi-lined text. Note that spaces between paragraphs are retained.\nAn example component-model.conf file (for the TCS Pointing Kernel Assembly, described in the TCS CoDR WBS) is shown below:\nsubsystem = TCS\ncomponent = TCS PK Assembly\nmodelVersion = \"3.0\"\nwbsId = tmt.tel.cont.tcs.tpk\ntitle = \"Telescope Pointing Kernel Assembly\"\ncomponentType = Assembly\n\ndescription = \"\"\"\nPointing Kernel Assembly is responsible for receiving target and offset commands. Based on targets received assembly will produce stream of target demands that will be used by\ntracking mechanism in Mount,Enclouser,Rotator,Guiders,Probes etc. Pointing Kernel Assembly utilizes C++ based third party libraries like tpk,slalib,tcspk.\n\"\"\"\nThe icd-db program can output a document in PDF or HTML format with the –o option. The figure below shows a portion of the PDF output related to the above component-model.conf file:","title":"Component-model"},{"location":"/modelFiles/modelFiles.html#parameters-types-and-units","text":"The following two sections describe events and commands, both of which can have sets of parameters. A parameter can have a number of fields defined in the file parameter-schema.json. Minimally, it must be a name, description, and type or a name, description, and enum (enumeration). Parameter fields are described in the table below. Parameter field names must be unique within an event item.\nThe table below lists the set of required fields for parameters. Note that yes/no here means that one of type or enum is required, but both are not possible in the same parameter.\nField Required? Notes name yes The name of a parameter in the enclosing item. description yes A text description of the parameter. type yes/no The type of a value or array. Can be one of: array, boolean, integer, string, byte, short, long, float, double, taiTime, utcTime, eqCoord, solarSystemCoord, minorPlanetCoord, cometCoord, altAzCoord, coord (corresponding to supported types in the CSW software: See below). enum yes/no An enum as in enum = {A, B}\nOther fields can be optionally added to the parameter as needed, depending on the type of parameter. For values that have units, the units must be one of the allowed CSW units (see below).\nField Required? Notes units yes if possible The units of a value in a parameter. See below for allowed values. minItems no If the parameter is a one-dimensional array, this specifies the minimum number of items in the array. Can also be specified using the dimensions field for arrays types (see below). maxItems no If the parameter is a one-dimensional array, this specifies the maximum number of items in the array. Can also be specified using the dimensions field for arrays types (see below). minLength no For string parameters, the minimum expected string length. maxLength no For string parameters, the maximum expected string length. dimensions no If the parameter value is a multi-dimensional array, this is an array of dimension sizes for the value. minimum no When a value can be a range, this is the minimum possible (a number or -inf). maximum no When a value can be a range, this is the maximum possible (a number or inf). exclusiveMinimum no When a value can be a range, this is the minimum possible, exclusive of this value (a number or –inf). exclusiveMaximum no When a value can be a range, this is the maximum possible, exclusive of this value (a number or inf). default no This is the default value for the parameter, if there is one. allowNaN no Set to true if the parameter value can be NaN (default: false)","title":"Parameters, Types and Units"},{"location":"/modelFiles/modelFiles.html#fits-keywords","text":"In addition to the above fields, event parameters may contain fields with information about the FITS keywords for which the parameter is the source:\nField Required? Notes keyword no This is the name of the FITS keyword generated from the parameter value. channel no If the FITS keyword has multiple source parameters, this specifies the channel name for this source. keywords no Use if multiple FITS keywords are produced from this event parameter (See below).\nFor the keywords field in the above table: If multiple keywords are produced from an event parameter (from different parts of an array or matrix), this form can be used:\nkeywords: [\n {\n keyword = OIWFS1PS\n rowIndex = 0\n }\n {\n keyword = OIWFS2PS\n rowIndex = 1\n }\n {\n keyword = OIWFS3PS\n rowIndex = 2\n }\n]\nIn this format, rowIndex refers to a row in a matrix parameter value, while index refers to an index in the parameter value array.","title":"FITS Keywords"},{"location":"/modelFiles/modelFiles.html#parameter-types","text":"The table below lists the available types for parameters, which correspond to the supported parameter types in the CSW framework. Note that a parameter in CSW can always have multiple values. It is not necessary (or supported) to define an array of strings or booleans, since a string or boolean parameter can already have multiple values.\nType Description boolean,integer, string, byte, short, long, float, double Values have the corresponding primitive types in Scala, Java, Typescript, etc. array An array or matrix of (lists of) numerical values (not string or boolean) taiTime, utcTime Holds TAI or UTC time values EqCoord, solarSystemCoord, minorPlanetCoord, cometCoord, altAzCoord, coord See the CSW source for details of these coordinate parameter types. Note that coord (CSW Coord) is a base type that can be used for any of the coordinate types.\nIf the parameter type is an array, there are some special tags for describing it. The minItems and maxItems parameters can be used for 1-Dimensional arrays and is especially useful for arrays with a variable length. However, for other arrays, including higher dimensional arrays, a dimensions tag can be used, with a syntax of [x,y,z,…] where x, y, and z are positive integers specifying the size of each dimension. Note that the CSW framework only supports numerical array and matrix types, although each item of the array or matrix can be a list of one or more values.\nTo describe the items in an array, an “items” block is used. Within it, the type is set using the type field. The mimimum, maximum, exclusiveMinimum, and exclusiveMaximum fields may be used as well.\nIn the CSW framework, only numerical array parameter types are supported, however since every parameter may have multiple values, it is usually not necessary to declare the type as an array.\nNote that the value of the mimimum, maximum, exclusiveMinimum, and exclusiveMaximum fields may be numeric or “inf” or “-inf” (for +/- infinity).","title":"Parameter Types"},{"location":"/modelFiles/modelFiles.html#units","text":"The CSW software defines a list of standard units that are accepted. If not in this list, please add it to the description field and/or request that it be added to the standard list.\nNote: This list can be found in the icd source tree under icd-db/src/main/resources/3.0/units.conf\n// Enumeration including all available CSW units\n\nenum = [\n // SI units\n angstrom // angstrom\n alpha // alpha: fine structure constant\n ampere // ampere: unit of electric current\n arcmin // arc minute; angular measurement\n arcsec // arc second: angular measurement\n bar // bar: metric ton of pressure\n candela // candela(lumen/sr)\n day // day\n degree // degree: angular measurement 1/360 of full rotation\n degC // Degree Celsius K\n degF // Fahrenheit\n elvolt // electron volt\n gauss // gauss\n gram // gram\n hertz // frequency\n henry // Henry\n hour // hour\n joule // Joule: energy\n kelvin // Kelvin: temperature with a null point at absolute zero\n kilogram // kilogram, base unit of mass in SI\n kilometer // kilometers\n liter // liter, metric unit of volume\n lm // lumen\n lsun // solar luminosity\n lx // lux(lm/m2)\n mas // milli arc second\n me // me(electron_mass)\n meter // meter: base unit of length in SI\n microarcsec // micro arcsec: angular measurement\n millimeter // millimeters\n millisecond // milliseconds\n micron // micron: alias for micrometer\n micrometer // micron\n minute // minute\n MJD // Mod. Julian Date\n mol // mole- unit of substance\n month // Month name or number\n mmyy // mmyy: Month/Year\n mu0 // mu0: magnetic constant\n muB // Bohr magneton\n nanometer // nanometers\n newton // Newton: force\n ohm // Ohm\n pascal // Pascal: pressure\n pi // pi\n pc // parsec\n ppm // part per million\n radian // radian: angular measurement of the ratio between the length of an arc and its radius\n second // second: base unit of time in SI\n sday // sidereal day is the time of one rotation of the Earth\n steradian // steradian: unit of solid angle in SI\n volt // Volt: electric potential or electromotive force\n watt // Watt: power\n Wb // Weber\n week // week\n year // year\n\n // CGS units\n coulomb // coulomb: electric charge\n centimeter // centimeter\n D // Debye(dipole) A electric dipole moment\n dyn // dyne: Unit of force\n erg // erg: CGS unit of energy\n\n // Astropyhsics units\n au // astronomical unit: approximately the mean Earth-Sun distance\n a0 // bohr radius: probable distance between the nucleus and the electron in a hydrogen atom in its ground state\n c // c: speed of light\n cKayser // cKayser\n crab // Crab: astrophotometrical unit for measurement of the intensity of Astrophysical X-ray sources\n damas // damas: degree arcminute arcsecond (sexagesimal angle from degree)\n e // electron charge\n earth // earth (geo) unit\n F // Farad: F\n G // gravitation constant\n geoMass // Earth Mass\n hm // hour minutes (sexagesimal time from hours)\n hms // hour minutes seconds (sexagesimal time from hours)\n hhmmss // hour minutes seconds (sexagesimal time)\n jansky // Jansky: spectral flux density\n jd // Julian Day\n jovmass // Jupiter mass\n lightyear // light year\n mag // stellar magnitude\n mjup // Jupiter mass\n mp // proton_mass\n minsec // minutes seconds (sexagesimal time from minutes)\n msun // solar mass\n photon // photon\n rgeo // Earth radius (eq)\n rjup // Jupiter Radius(eq)\n rsun // solar radius\n rydberg // energy of the photon whose wavenumber is the Rydberg constant\n seimens // Seimens\n tesla // Tesla\n u // atomic mass unit\n\n // Imperial units\n barn // barn: metric unit of area\n cal // thermochemical calorie: pre-SI metric unit of energy\n foot // international foot\n inch // international inch\n pound // international avoirdupois pound\n mile // international mile\n ounce // international avoirdupois ounce\n yard // international yard\n\n // Others - engineering\n NoUnits // scalar - no units specified\n bit // bit: binary value of 0 or 1\n encoder // encoder counts\n count // counts as for an encoder or detector\n mmhg // millimetre of mercury is a manometric unit of pressure\n percent // percentage\n pix // pixel\n\n // Datetime units\n tai // TAI time unit\n utc // UTC time unit\n date // date\n datetime // date/time\n]","title":"Units"},{"location":"/modelFiles/modelFiles.html#parameter-examples","text":"Below are some examples of parameter definitions:\nparameters = [\n {\n name = temp_ngsWfs\n description = \"NGS WFS temperature\"\n type = float\n units = kelvin\n exclusiveMinimum: -inf\n exclusiveMaximum: inf\n allowNaN: true\n\t keyword = IMGTMPXX\n }\n {\n name = temp_lgsWfs\n description = \"LGS WFS temperature\"\n type = float\n units = kelvin\n exclusiveMinimum: 0\n exclusiveMaximum: 100\n allowNaN: true\n }\n {\n name = temp_ndme\n description = \"NDME crate temperatures\"\n type = array\n dimensions: [7]\n items = {\n type = float\n units = kelvin\n }\n }\n {\n name = temp_actuator\n description = \"motor & piezo actuator temperatures\"\n type = array\n dimensions: [30]\n items = {\n type = float\n minimum = 1.234\n units = kelvin\n }\n }\n ]","title":"Parameter Examples"},{"location":"/modelFiles/modelFiles.html#publish-model","text":"Each component can publish events, observe events, images and current state. Other systems can subscribe or get these. A component’s published events and images are described in the publish-model.conf file. The file consists of some high-level content and then sections for events, observeEvents, images and currentState.\nNote As per Change Request 261, the telemetry and event services have been merged into one unified service, and telemetry items distinct from events have been eliminated. Furthermore, events and event streams have also been consolidated into a single event type.\nThe table below lists the required and optional fields for publish-model.conf:\nField Required? Notes subsystem yes Name of the subsystem. Must be the same as SE subsystem name. Should be the same as the component-model.conf and subsystem-model.conf component yes The name of the component. publish yes This is a container for the kinds of data the system publishes. It is required.\nThe publish block contains a description and then containers for the different kinds of publishable events. The table below lists the fields for the required publish block:\nField Required? Notes description no Optional overview or notes on items published by the component. events no Block for events that are published by the component observeEvents no Block for observe events that are published by the component. There is a list of predefined observe events (see below). images no Block for images that are published by the component. currentStates no Block for current states that are published by the component. alarms no Block for alarms published by the component (Deprecated: See alarm-model.conf below).\nNote that the publish-model.conf file is not required if the container does not publish any events or . Note also that none of the fields of the publish container are required. Adding a publish-model.conf file to the component model that is empty will create an empty section in the documentation (In that case it would be preferable to leave out the publish-model.conf file). The following tables discuss each of the different kinds of events.","title":"Publish-model"},{"location":"/modelFiles/modelFiles.html#events","text":"The event container is an array containing one or more event items.\nEvents fall into the following categories. The purpose of the categories is to easily find events of different categories without a catalog.\nCategory Description DEMAND An event that is used to transmit a desired position. These events are high frequency/periodic and should not be archived long-term or should be seriously curated into a smaller representative collection. CONTROL Similar to a DEMAND, but probably not periodic and considerably less frequent. CONTROL events are events driving other devices, but may be internal to a system. These also may be curated. EVENT An event that is used to indicate that something has happened. Observe Events are one EVENT type. STATUS (Default) Used primarily to update a user interface. These events are archived. They are not high frequency and are not periodic.\nThe fields of an event item are shown in the table below:\nField Required? Notes name yes The name of the event item. This should be a simple name like “zenithAngle”. The prefix for all events is subsystem.component. category no The event category (One of: DEMAND, CONTROL, EVENT, STATUS). description no An optional description of a single event item (may contain Markdown and HTML). The description is in triple quotes for multi-lined text. Note that spaces between paragraphs are retained. requirements no List of requirements that flow to this item. maxRate no Maximum publishing rate in Hz. archive no A Boolean (true/false) stating whether the component recommends archiving this eventitem. archiveDuration if archive is true Lifetime of the archiving (for example ‘2 years’ or ‘6 months’) parameters yes A container of parameters that belong to this event item.\nUnlike an EPICS channel, a CSW event can contain several associated keys and values (called parameters in the schema).\nAn excerpt from an example publish-model.conf file for the TCS pk Assembly is shown below. It shows part of the definition of the zenithAngle event.\npublish {\n event = [\n {\n name = zenithAngle\n description = \"\"\"\n |The zenith angle is the distance in degrees of the telescope's optical axis from the zenith.\n |\n |The zenithAngle event item includes both the zenith angle for the current position of the\n |telescope\n |as well as the demanded zenith angle. When the telescope is tracking, the error between \n |demand and current should be zero.\n |\"\"\"\n requirements = [“REQ-2-TCS-4270”]\n maxRate = 20\n archive = true\n archiveDuration = 1 year\n parameters = [\n {\n name = current\n description = \"Actual or current zenith angle of the telescope\"\n type = float\n minimum = 0\n maximum = 90\n units = degree\n }\n {\n name = demand\n description = \"The demanded zenith angle of the telescope\"\n type = float\n minimum = 0\n maximum = 90\n units = degree\n }\n ]\n }\nThe annotated screenshot below shows the portion of the file generated by the command: icd-db -s TCS –o TCS.pdf, which generates a PDF file for the TCS subsystem. The figure shows where each of the fields ends up on the final product.","title":"Events"},{"location":"/modelFiles/modelFiles.html#observe-events","text":"Observe events are different from other events in that they are predefined. For this reason you only need to list the name of the observe event in the publish model file under observeEvents. For example:\nobserveEvents = [\n ObserveStart\n ObserveEnd\n]\nThe predefined observe event names are references to the tmt-icd/ESW-Model-Files definitions on GitHub.\nBelow is an example that references all the predefined observe events:\nobserveEvents = [\n ObserveStart\n ObserveEnd\n ExposureStart\n ExposureEnd\n ReadoutEnd\n ReadoutFailed\n DataWriteStart\n DataWriteEnd\n ExposureAborted\n PrepareStart\n\n // IRDetector specific\n IRDetectorExposureData\n IRDetectorExposureState\n\n // OpticalDetector specific\n OpticalDetectorExposureData\n OpticalDetectorExposureState\n\n // WFSDetector specific\n WfsDetectorExposureState\n PublishSuccess\n PublishFail\n\n // Sequencer specific\n PresetStart\n PresetEnd\n GuidestarAcqStart\n GuidestarAcqEnd\n ScitargetAcqStart\n ScitargetAcqEnd\n ObservationStart\n ObservationEnd\n ObservePaused\n ObserveResumed\n DowntimeStart\n\n // DMS specific\n MetadataAvailable\n ExposureAvailable\n ]","title":"Observe Events"},{"location":"/modelFiles/modelFiles.html#images","text":"The images section of the publish-model.conf file is used to declare that a component publishes images that other components can subscribe to (via the TMT VIZ APIs that are to be defined).\nThe images container is an array containing one or more image description items. The fields of an image item are shown in the following table:\nField Required? Notes name yes The name of the image item. This should be a simple name like “guider1”. The prefix for all images is subsystem.component. description yes A description of a single image item (may contain Markdown and HTML). The description is in triple quotes for multi-lined text. channel yes The VIZ image channel (for example: viz.wfos.agwfs1) format no The image format (default: FITS) size yes An array of two numbers: the image dimensions (for example: [2048, 2048]]) pixelSize yes Number of bytes per pixel maxRate no Maximum rate the image is published metadata yes A container of one or more metadata items that belong to this image.\nThe format of a single metadata item for an image is shown in the table below:\nField Required? Notes name yes Name of the image metadata description yes A description of this metadata type yes The data type of the keyword value (One of: [boolean, integer, string, byte, short, long, float, double]) keyword no FITS keyword (for example: SCALE, ITIME)\nBelow is an example section of a publish-model.conf file that shows two published images. Other components can then reference these images in the subscribe-model.conf file to indicate that they will subscribe to the published images.\nimages = [\n {\n name = guider1\n description = \"Images from the WFOS AGWFS 1\"\n channel = viz.wfos.agwfs1\n format = FITS\n size = [2048, 2048]\n pixelSize = 2\n maxRate = 5.0\n metadata = [\n {\n name = platescale\n type = float\n description = \"platescale of image in arcsec/pixel\"\n keyword = SCALE\n }\n {\n name = integrationTime\n type = integer\n description = \"integration time of image in ms\"\n keyword = ITIME\n }\n ]\n }\n {\n name = guider3\n description = \"Images from the WFOS AGWFS 3\"\n channel = viz.wfos.agwfs1\n format = FITS\n size = [2048, 2048]\n pixelSize = 2\n maxRate = 5.0\n metadata = [\n {\n name = platescale\n type = float\n description = \"platescale of image in arcsec/pixel\"\n keyword = SCALE\n }\n {\n name = integrationTime\n type = integer\n description = \"integration time of image in ms\"\n keyword = ITIME\n }\n ]\n }\n ]","title":"Images"},{"location":"/modelFiles/modelFiles.html#other-event-types","text":"Some events signal an occurrence of an activity in a component that other systems use to synchronize actions. Some, like observe events, are system defined. They are not periodic, so a rate is not necessary. The publish-model.conf file has a container for events the component publishes that includes an array of one or more events.\nCurrent states, which are published by HCDs for assemblies, are not actually events, but are structured the same, and written in the currentStates block instead of the events block.\nEvents and current states have the same schema, with a name, description, and parameters describing the event data. Below is an example current state event described in the publish-model.conf file:\ncurrentStates = [\n {\n name = \"nacqUnarchived\"\n archive = false\n parameters = [\n {\n name = nacq_detector_state\n description = \"current state of the NACQ detector\"\n enum = [EXPOSING, READING, IDLE, ERROR]\n }\n {\n name = nacq_period\n description = \"NACQ continuous read period\"\n type = float\n units = seconds\n }\n {\n name = nacq_contRead\n description = \"NACQ continuous read state enabled\"\n type = boolean\n }\n {\n name = nacq_mag_position\n description = \"NACQ magnifier stage motor position\"\n type = float\n // units = TBD\n }\n {\n name = nacq_position\n description = \"nominal position of the NACQ/NHRWFS stage for the NACQ \"\n // array of 3 floating point numbers in mm\n type = array\n dimensions: [3]\n items = {\n type = float\n }\n units = mm\n }\n ]\n }\nThe screenshot below shows part of the PDF display for the above CurrentStates example:","title":"Other Event Types"},{"location":"/modelFiles/modelFiles.html#service-model-file","text":"Another optional icd model file is service-model.conf. It is used to describe HTTP services provided by or consumed by a component. The actual HTTP services are described in OpenAPI files that are also stored in the icd database.\nOn the consumer side, the file can indicate which routes of the HTTP service it uses.\nHere is an example consumer service-model.conf:\nsubsystem = TEST\ncomponent = env.ctrl\n\nrequires = [\n {\n subsystem = TEST2\n component = SegmentService\n name = esw-segment-db\n // Optional routes / paths used\n paths = [\n {\n path = /setPosition\n method = post\n },\n {\n path = /currentPositions\n method = get\n }\n ]\n }\n]\nThe above example states that the component uses the HTTP methods POST /setPosition and GET /currentPositions from the service. The paths are optional and just for information. The generated documentation for an ICD between two subsystems or components will only display the parts of HTTP services that are declared as being used (in the paths array). By default, if the paths are not specified, the complete service API will be included in the ICD documentation.\nIn the example service-model.conf file from a service provider below, the line:\nopenApi = esw-segment-db.json\npoints to the OpenAPI definition for the HTTP service that is being provided (The OpenAPI file should be in the same directory as the service-model.conf file and can be in JSON or YAML format and have the suffix .json, .yaml or .yml). Both the service-model information and the contents of the OpenAPI file are stored in the icd database where they are used to produce documentation (YAML files are first converted to JSON).\nservice-model.conf:\nsubsystem = TEST2\ncomponent = SegmentService\n\nprovides = [\n {\n name = esw-segment-db\n description = \"HTTP API to ESW Segment DB service, used for keeping track of TMT mirror segments\"\n openApi = esw-segment-db.json\n }\n]\nThe screenshot below shows how the above service provider info is displayed in the icd web app:\nIf you click on the small button in the Name column, the detailed display is toggled open or closed. If you click on the link next to it, the documentation for the HTTP service is opened in a new tab. The format of the documentation for HTTP services is different from that of events, since it is provided by the swagger-ui library. The PDF version is somewhat simpler and is provided by the swagger-codegen command line application.\nNote that each component can declare multiple services consumed and/or provided in the service-model.conf file. You can find example service-model.conf files and OpenAPI files in the examples/3.0 directory in the icd sources.","title":"Service Model File"},{"location":"/modelFiles/modelFiles.html#alarms","text":"An alarm is published to mark an abnormal condition that requires attention. Alarms are not errors; they are conditions that occur asynchronously while components are executing or inactive.\nThe alarm feature has been redesigned for the CSW PDR in response to CoDR comments. The structure of the model follows the design of the Alarm Configuration file, which provides a listing of all possible alarms within the Observatory, as well as information for the operator to respond to the alarm.\nThe table below lists the required and optional fields for an alarm definition in alarm-model.conf:\nField Required? Notes name yes Name of the alarm, which should be one word. description yes A description of the alarm including what is the cause and possible response. The description is in triple quotes for multi-lined text. Note that spaces between paragraphs are retained. requirements no List of requirements that flow to this alarm severityLevels yes An array of severity levels that the alarm can have (besides Disconnected, Indeterminate, Okay): Default is any severity. Possible values are: Warning, Major, Critical. location yes A text description of where the alarming condition is located alarmType yes The general category for the alarm: One of: Absolute, BitPattern, Calculated, Deviation, Discrepancy, Instrument, RateChange, RecipeDriven, Safety, Statistical, System probableCause yes The probable cause for each level or for all levels operatorResponse yes Instructions or information to help the operator respond to the alarm autoAck yes Does this alarm automatically acknowledge without operator? latched yes Does this alarm latch?\nBelow is an example alarm-model.conf file:\nsubsystem = TEST\ncomponent = env.ctrl\n\nalarms = [\n {\n name = limit\n description = \"The NGS FSM stage has reached a limit. It is not possible to position the FSM.\"\n requirements = [TBD]\n severityLevels = [Major]\n location = \"NGS FSM stage\"\n alarmType = System\n probableCause = \"The PFSM HCD was commanded without the knowledge of the assembly, or the configured soft limits are incorrect\"\n operatorResponse = \"Execute the datum command\"\n autoAck = false\n latched = true\n }\n ]\nThe PDF output generated from this part of the alarm-model.conf file is shown below:\nNote In previous icd versions, the alarms were listed in the publish-model.conf file and this is still supported for backward compatibility.","title":"Alarms"},{"location":"/modelFiles/modelFiles.html#subscribe-model","text":"The subscribe-model.conf file lists the event information a component subscribes to from other components. The subscribe-model.conf file is simpler than the publish-model.conf file, containing only references to the published items.\nLike publish-model.conf, the subscribe-model.conf file includes sections for each of the kinds of events or images that are available: events, observeEvents, images and currentStates. Each section is an array of items with the same fields as shown in the table below. Only the subsystem, component, and name fields are required.\nField Required? Notes subsystem yes Name of the publisher’s subsystem. component yes Name of the component publishing the item. name yes The simple name of the item such as: zenithAngle. usage no Describes how the item is being used by the subscriber requiredRate no The rate the subscriber needs updates of the item in order to operate properly (in Hz). This may not be the rate that the publisher publishes. maxRate no The maximum rate at which the subscriber can process the item (in Hz).\nBelow is an example subscribe-model.conf file for an IRIS component called oiwfs_adc_assembly that uses the published data of the TCS.\nsubsystem = IRIS\ncomponent = oiwfs_adc_assembly\n\nsubscribe {\n events = [\n {\n subsystem = TCS\n component = cmIRIS\n name = oiwfs1AtmDispersion\n usage = \"Atmospheric dispersion stream\"\n requiredRate = 1\n }\n {\n subsystem = TCS\n component = cmIRIS\n name = oiwfs2AtmDispersion\n usage = \"Atmospheric dispersion stream\"\n requiredRate = 1\n }\n {\n subsystem = TCS\n component = cmIRIS\n name = oiwfs3AtmDispersion\n usage = \"Atmospheric dispersion stream\"\n requiredRate = 1\n }\n {\n subsystem = IRIS\n component = oiwfs_poa_assembly\n name = POS_current\n usage = \"Current OIWFS probe rotations needed to set correct ADC orientations\"\n }\n {\n subsystem = NFIRAOS\n component = rtc\n name = oiwfsImage\n usage = \"OIWFS ellipticity correction stream for ADCs\"\n }\n ]\n}\nEvents have been redesigned for the CSW PDR. Components write their data and other systems sample it at the rate they need. requiredRate allows a component to state a rate they require to operate properly. It’s up to the publisher to make sure that they can provide that rate. This is part of checking interfaces.\nThere is minimal documentation for subscribe items. The full description of an item belongs with the publisher, not the subscriber. The subscriber is only referencing its use of information published by another component.\nThe name field must match the name of published item in another component. It must be spelled correctly. The best way is to browse the API of the source system and copy the full path.\nBy default, subscribed events are not displayed in API documents. To include them, pass the –clientApi option to icd-db, or select the Include client API information check box in the web app.\nThe figure below shows a section of the display of the icd web app for the above subscribe-model.conf file. The descriptions are looked up in the database (originally from publish-model.conf files in other components).\nSee also the example subsystems in the icd GitHub repo that show the different types of events and images used in the subscribe-model.conf files.","title":"Subscribe-model"},{"location":"/modelFiles/modelFiles.html#command-model","text":"The command-model.conf file describes the submit commands the component accepts (receive) and the submit commands it sends to other components it depends on (send). As in other sections, there is a block for the send and receive entries. The required and optional fields of command-model.conf are shown in the table below:\nField Required? Notes subsystem yes Name of the subsystem. Must be the same as SE subsystem name. component yes Name of the component that uses this command-model.conf file. Should match name used elsewhere. receive yes The block for commands this component supports. description no An optional overall description of the commands received by the component. The description is in triple quotes for multi-lined text. send no The block for commands this component sends to other components.\nThe receive block holds an array of items that are descriptions of commands the component receives or accepts.\nThe required and optional fields of the receive block are shown in table below.\nField Required? Notes name yes Name of the command (appended to prefix). description yes A description of the command. requirements no A list of one or more TMT requirements that are associated with this command. preconditions no List of preconditions for this command, including safety.precautions. Unless otherwise documented, it is assumed that the conditions ALL need to be met. postconditions no List of postconditions for this command, including safety precautions. Unless otherwise documented, it is assumed that the conditions ALL need to be met. requiredArgs no A list of command arguments (parameters) that are required. parameters no The block for arguments the command supports. Parameters are as described for events. completionType no Indicates the completion type of a command: See CSW CommandService API for details. Possible values: immediate, longRunning, oneway (default: immediate). resultType no Defines a list of parameters in the result (For commands that return a result) in the same format as the command parameters. completionCondition no For oneway commands, a list of conditions (string text) for determining command completion (if applicable). Unless otherwise documented, it is assumed that the conditions ALL need to be met. role no The user role required in order to execute this command (one of: eng, admin or user). Some commands may be protected and only allowed for engineering or admin users. The default required role is a regular user role.\nThe contents of the parameters and resultType containers are parameters as described for events in a previous section.\nThe send block contains a list of commands this component sends to other components. The required fields for each item in the list are shown in the following table.\nField Required? Notes subsystem yes The TMT subsystem for the component that receives the command component yes Name of the component that receives the command. Should match name used elsewhere. name yes name of the command\nAn example of the beginning and the receive block from a command-model.conf file for is shown below.\nsubsystem = TEST\ncomponent = lgsWfs\n\ndescription = \"Example Commands …\"\n\nreceive = [\n {\n name = LGS_WFS_INITIALIZE\n description = \"\"\"\n |LGS_WFS_INITIALIZE command will:\n |* disable the LGS WFS engineering continuous read mode (if required)\n |* (re)connect to the LGS WFS HCD\n |* set LGS WFS exposure parameters to default values\n \"\"\"\n requirements = [\"INT-TEST-AOESW-1000\"]\n parameters = [\n {\n name = wfsUsed\n description = \"OIWFS used\"\n type = string\n }\n ]\n completionType = oneway\n completionCondition = [\n \"List of conditions to meet for oneway command to be complete...\",\n \"condition two\",\n \"condition three\"\n ]\n }\n]\nThe resulting PDF display for the above model file is shown in the screenshot below.\nThe send container documents the configuration commands one component sends to another. This allows mapping the command flow in the system and dependencies between components. The name of the configuration command, the component and the subsystem are enough to identify the destination of the configuration command.\nThe example send container section of the command-model.conf file for the TCS Corrections assembly is shown below.\nsend = [\n //*******\n // cabinet-environment assembly\n {\n name = GLY_init\n subsystem = IRIS\n component = cabinet_environment_assembly\n }\n {\n name = GLY_test\n subsystem = IRIS\n component = cabinet_environment_assembly\n }\n {\n name = TEMP_init\n subsystem = IRIS\n component = cabinet_environment_assembly\n }\n {\n name = TEMP_test\n subsystem = IRIS\n component = cabinet_environment_assembly\nThe generated HTML output from the above send section of the command-model.conf file is shown below. The description and other details are taken from the publish information in the database.\nNote By default, sent commands are not displayed in API documents. To include them, pass the –clientApi option to icd-db, or select the Include client API information check box in the web app.","title":"Command-model"},{"location":"/icd-db/icd-db.html","text":"","title":"Using the icd-db command line app"},{"location":"/icd-db/icd-db.html#using-the-icd-db-command-line-app","text":"The icd-db program can be used to validate and ingest model files into the database. In order to use the icd-db program, the MongoDB server must be running (see Installing MongoDB). Most of what icd-db command provides can also be done using the web interface, so it’s possible to skip this step.\nThe figure above shows the usage of the icd-db program. Its primary purpose is to validate and ingest model files into the ICD Model File Database. If any of the model files under the given directory don’t pass validation, then nothing is changed in the database. Error messages indicate where the validation errors occurred, including a file name and a position in JSONPath format.\nBelow you see the options for the icd-db command, which are listed with the –help option. Some of the options are basic querying of the database, to see what subsystems and components are currently in the local database, and information about them, such as data rates and units used. This can be useful when developing and browsing APIs without bringing up the full system.\nicd-db 3.0.0\nUsage: icd-db [options]\n\n --db The name of the database to use (default: icds4)\n -h, --host The host name where the database is running (default: localhost)\n -p, --port The port number to use for the database (default: 27017)\n -i, --ingest Top level directory containing files to ingest into the database\n -l, --list [subsystems|assemblies|hcds|all]\n Prints a list of ICD subsystems, assemblies, HCDs or all components\n --listData Prints a list of event sizes and yearly accumulation of archived data for \n\t\t\t components of the specified subsystem.\n -u, --allUnits Prints the set of unique units used in all received commands and published events \n\t\t\t for all components in DB.\n -c, --component Specifies the component to be used by any following options \n\t\t\t (subsystem must also be specified)\n -s, --subsystem [:version]\n Specifies the subsystem (and optional version) to be used by any following options\n -t, --subsystem2 [:version]\n Specifies the second subsystem (and optional version) in an ICD to be used by \n\t\t\t any following options\n --component2 Specifies the subsytem2 component to be used by any following options \n\t\t\t (subsystem2 must also be specified)\n --icdversion \n Specifies the version to be used by any following options (overrides subsystem \n\t\t\t and subsystem2 versions)\n -o, --out Saves the selected API (or ICD) to the given file in a format based on the file's\n \t\t\t suffix (html, pdf) or generates code for the given API in a language based on the\n \t\t\t suffix ('scala', 'java', 'ts' (typescript), py (python))\n --drop [db|subsystem|component]\n Drops the specified component, subsystem, or the entire icd database \n\t\t\t (requires restart of icd web app)\n --versions List the version history of the given subsystem\n --diff :[,version2]\n For the given subsystem, list the differences between and \n\t\t\t (or the current version)\n -m, --missing \n Generates a 'Missing Items' report to the given file (dir for csv) in a format \n\t\t\t based on the file's suffix (html, pdf, otherwise text/csv formatted files are\n \t\t\t generated in given dir)\n -a, --archived \n Generates an 'Archived Items' report for all subsystems (or the given one) to the\n \t\t\t given file in a format based on the file's suffix (html, pdf, csv)\n --allSubsystems Include all subsystems in searches for publishers, subscribers, etc. while \n\t\t\t generating API doc (Default: only consider the one subsystem)\n --clientApi Include subscribed events and sent commands in the API dic (Default: only include\n\t\t\t published events and received commands)\n --orientation [portrait|landscape]\n For PDF output: The page orientation (default: landscape)\n --fontSize For PDF or HTML file output: The base font size in px for body text (default: 10)\n --lineHeight For PDF or HTML file output: The line height (default: 1.6)\n --paperSize [Letter|Legal|A4|A3]\n For PDF output: The paper size (default: Letter)\n --documentNumber text For PDF output: An optional document number to display after the title/subtitle\n --package package.name Package name for generated Scala files (default: no package)\n --help\n --version\nSome example commands are shown below.\nTo ingest the directory of model files created in the last section use the -i or --ingest option:\nicd-db --ingest directoryName\nThe –l or --list option with a value of subsystems, assemblies, HCDs, or all will list the components in the database that meet the criteria:\n$ icd-db –list all\nTo list just assemblies:\n$ icd-db –list assemblies\nList only HCDs:\n$ icd-db –list hcds\nList the existing subsystems in the local database:\n$ icd-db –list subsystems\nSeveral other commands are available and are not documented here.","title":"Using the icd-db command line app"},{"location":"/icd-db/icd-db.html#generating-documents-and-code-from-the-icd-database","text":"The icd-db –o option can be used to output a file in a format based on the file’s suffix (.pdf and .html are supported for generating documentation and .scala, .java, .py (python) and .ts (typescript) are supported for generating code containing the event, command and parameter keys for the given subsystem and/or component:\n$ icd-db –s TCS -o TcsApi.pdf // Generate a PDF for TCS\n$ icd-db –s TCS -o TcsApi.scala // Generate Scala code for TCS\n$ icd-db –s TCS -o TcsApi.java // Generate Java code for TCS\n$ icd-db –s TCS -o TcsApi.py // Generate Python code for TCS\n$ icd-db –s TCS -o TcsApi.ts // Generate Typescript code for TCS\nYou can also generate documentation and code for a specific component of a subsystem and specify the package name (required for Java):\n$ icd-db –s IRIS -c ifs.scale -o IrisApi.pdf // Generate a PDF for IRIS.ifs.scale\n$ icd-db –s IRIS -c ifs.scale –package iris.api -o IrisApi.scala // Generate Scala code for IRIS.ifs.scale\n$ icd-db –s IRIS -c ifs.scale –package iris.api -o IrisApi.java // Generate Java code for IRIS.ifs.scale\n$ icd-db –s IRIS -c ifs.scale -o IrisApi.py // Generate Python code for IRIS.ifs.scale\n$ icd-db –s IRIS -c ifs.scale -o IrisApi.ts // Generate Typescript code for IRIS.ifs.scale\nThe generated code always contains a top level object (scala), class (java, python) or namespace (typescript) with the base name of the file. Then there are nested objects for each component, and in each component, nested objects for each event and command, containing constants for all the event keys, command names and parameter keys.\nNote After generating the code, icd-db attempts to format it using a command line formatter application in your shell path. It uses scalafmt for Scala, prettier for TypeScript, black for Python and google-java-format for Java. If it doesn’t find those it will print a message, but still generate the file. You can install scalafmt and google-java-format with cs (coursier), black with pip (pip3), and prettier with npm.\nYou can also generate code using the web interface, as described later.","title":"Generating Documents and Code from the ICD Database"},{"location":"/icd-fits/icd-fits.html","text":"","title":"Using the icd-fits command line app"},{"location":"/icd-fits/icd-fits.html#using-the-icd-fits-command-line-app","text":"The icd-fits command line application can be used to view and update the FITS Dictionary and related files or to generate a PDF or other type of file displaying the FITS keywords for a given subsystem or component.\nIn normal operations, the FITS Dictionary is loaded automatically from the published DMS-Model-Files GitHub repository. At the time of writing this has not yet been published.\nBelow are the available options for the icd-fits program, which you can list with the icd-fits --help option:\nicd-fits 3.0.0\nUsage: icd-fits [options]\n\n -d, --db The name of the database to use (for the --ingest option, default: icds4)\n --host The host name where the database is running (for the --ingest option, default: localhost)\n --port The port number to use for the database (for the --ingest option, default: 27017)\n -c, --component Specifies the component to be used by any following options (subsystem must also be specified)\n -s, --subsystem [:version]\n Specifies the subsystem (and optional version) to be used by any following options\n -t, --tag Filters the list of FITS keywords to those with the given tag\n -l, --list Prints the list of known FITS keywords\n --validate Validates a JSON formatted file containing the FITS Keyword dictionary and prints out any errors\n -g, --generate Generates an updated FITS dictionary JSON file by merging the one currently in the\n icd database with the FITS keyword information defined for event parameters in the\n \t\t\t\t publish model files. If a subsystem is specified (with optional version), the\n \t\t\t\t merging is limited to that subsystem.\n -i, --ingest Ingest a JSON formatted file containing a FITS Keyword dictionary into the icd database\n --ingestTags Ingest a JSON or HOCON formatted file defining tags for the FITS dictionary into the icd database\n --ingestChannels Ingest a JSON or HOCON formatted file defining the available FITS channels for each subsystem into the icd database\n -o, --out Generates a document containing a table of FITS keyword information in a format \n\t\t\t based on the file's suffix (html, pdf, json, csv, conf (HOCON))\n --orientation [portrait|landscape]\n For PDF output: The page orientation (default: landscape)\n --fontSize For PDF or HTML file output: The base font size in px for body text (default: 10)\n --lineHeight For PDF or HTML file output: The line height (default: 1.6)\n --paperSize [Letter|Legal|A4|A3]\n For PDF output: The paper size (default: Letter)\n --help\n --version\n --version","title":"Using the icd-fits command line app"},{"location":"/icd-fits/icd-fits.html#fits-keywords","text":"The generated subsystem APIs contain infomation about FITS keywords whose values come from event parameters. That is, an event’s parameter value is the source of the FITS keyword’s value.\nFITS keyword data is stored in three files under DMS-Model-Files on GitHub. Once DMS is published, the file should be automatically loaded by the icdwebserver or icd-git --ingest commands. Until then, the FITS keywords, channels and tags can be manually loaded into the icd database once by running (from the icd source directory):\nicd-fits -i examples/3.0/FITS-Dictionary.json --ingestChannels examples/3.0/FITS-Channels.conf --ingestTags examples/3.0/FITS-Tags.conf\nAlternatively you can check out and manually ingest DMS-Model-Files into the local icd database by using the Upload feature in the icd web app or with the command line:\nicd-db -i DMS-Model-Files\nThe contents of the files are as follows: * * FITS-Dictionary.json - This is the FITS dictionary and contains an entry for each FITS keyword, mapping it to source event parameters. If a keyword has multiple sources, named channels are used, each containing one source. * FITS-Channels.conf - This defines which channels are available for each subsystem (Channels are used when a FITS keyword has multiple source event parameters). * FITS-Tags.conf - Assigns tags to FITS keywords, which can be used in the web app to filter and display the FITS keyword information.\nBesides the three above files, FITS keyword information can be defined in the publish-model.conf files for each subsystem component. Event parameters can define the associated keyword as follows:\nkeyword = IMGDISWV\nIf the keyword has multiple source parameters, you can specify the channel:\nkeyword = IMGDISWV\nchannel = ATM\nIn some more complicated cases, you can also specify multiple keywords whose values are taken from an index (or rowIndex for matrix/2d arrays) in the parameter’s array values:\nkeywords: [\n {\n keyword = OIWFS1PS\n rowIndex = 0\n }\n {\n keyword = OIWFS2PS\n rowIndex = 1\n }\n {\n keyword = OIWFS3PS\n rowIndex = 2\n }\n]\nThe FITS keyword definitions in a subsystem’s model files can be used to generate a new FITS dictionary by merging the existing FITS dictionary with the definitions in the publish model files. In this case the information from the published events overrides the information in the existing FITS dictionary:\nicd-fits --subsystem IRIS --generate FITS-Dictionary.json\nOr using the short form options and with a subsystem version:\nicd-fits -s IRIS:1.7 -g FITS-Dictionary.json\nThe generated FITS dictionary JSON file can then be copied to the DMS-Model-Files repository and published, so that it will be automatically used by the icd web app and command line apps (Note that Publishing DMS-Model-files requires special permission).\nYou can also manually load the new FITS dictionary into your local icd database using the command line:\nicd-fits -i FITS-Dictionary.json","title":"FITS Keywords"},{"location":"/icd-fits/icd-fits.html#generating-a-document-listing-the-fits-keywords","text":"You can use icd-fits to print a list of keywords coming from a subsystem or component to stdout. For example, the following command lists the keywords for IRIS:\nicd-fits --subsystem IRIS --list\nOr you can use the short form options and restrict the output to a component:\nicd-fits -s IRIS -c pupilview -l\nYou can create a PDF of the IRIS FITS keywords like this:\nicd-fits -s IRIS -o IRIS-Keywords.pdf\nThe format of the output file depends on the suffix. You can also generate csv, html, json and conf (HCON) formatted files with the same information.","title":"Generating a Document listing the FITS Keywords"},{"location":"/webapp/webapp.html","text":"","title":"Using the Web Interface"},{"location":"/webapp/webapp.html#using-the-web-interface","text":"This section describes the web interface for IDBS. The idea is to show each of the possible steps.\nThe browser-based user interface allows ingesting model files and displaying versioned “API”s for each component. An API is defined as all the public functionality of a component and subsystem including inputs and outputs. An ICD is produced by taking the intersection of two published subsystem API documents. ICDs are then also published as versioned documents that depend on published subsystem API versions. The publishing of APIs and ICDs is a role of Systems Engineering and is therefore password protected. It can be performed using the icd web app (requires special command line option to icdwebserver). The web interface can be used to produce draft ICD and API documents that can be shared prior to the official publishing by Systems Engineering.","title":"Using the Web Interface"},{"location":"/webapp/webapp.html#starting-the-icd-web-app","text":"To start the icd web app, run:\nicdwebserver\nBy default, this starts the web app on port 9000 on localhost (http://localhost:9000). You can override this with options. For example:\nicdwebserver -Dhttp.port=9898 -Dhttp.host=192.168.178.77","title":"Starting the icd web app"},{"location":"/webapp/webapp.html#upload-files","text":"Installing the web app and uploading through the web app is not a bad way to check the content of model files because it also allows checking to see if the links are entered correctly. icd-db will only check that the files are syntactically correct.\nUploading with the browser works best with recent browser versions that support uploading a directory including all files in the directory. By using this feature, you can upload an entire subsystem of model files in one click. If your browser does not support uploading directories, try using Chrome.\nIf the web server is running on your own machine, go to http://localhost:9000. The empty website is shown in the following figure. The upload button is shown circled in red (the red circle does not appear in the UI!)\nNote The icd web app automatically ingests any released APIs and ICDs on startup by downloading any missing versions from the GitHub repos under https://github.com/tmt-icd. Then you can upload any directories containing model files that you are working on. These will be the considered the “working version” or “*” in the subsystem version menu.","title":"Upload Files"},{"location":"/webapp/webapp.html#procedure-for-uploading-files","text":"Select the upload button in the web app. The following figure shows the web page after selecting the upload button:\nSelect the Choose Files button and navigate to the directory of your model files. It can be a directory holding a single component or a directory containing other directories where each contained directory includes one component as shown in the following figure. The parent directory should be imported at least once to get the subsystem-model.conf file, which is a sibling of the component directories.\nSelecting the directory will cause the web service to upload all the contained files and import them into the model file database. The program shows progress and the status area shows any problems. The following figure shows the result of uploading the APS-Model-Files directory. It shows a progress bar in blue at 100%. Files other than icd model files are ignored and a warning is displayed (in case the file name was misspelled).\nThat’s all for uploading. This can be done over and over and nothing is permanent until the API is published.","title":"Procedure for Uploading Files"},{"location":"/webapp/webapp.html#view-a-subsystem-api","text":"The next example shows how to view a subsystem API.\nWith the subsystem uploaded, its API can be viewed in the browser by selecting the subsystem in the subsystem pull-down menu at the top of the screen. The menu shows all the subsystems found in the local database. The browser content area will redraw with the contents of the selected subsystem. The result of selecting APS is shown in the following figure.\nA couple of things to note: The area to the left shows a number of links. This area has one link for each component in the subsystem.\nThe content area displays all the components for the subsystem. Clicking on one of the component links jumps to the given component’s information.\nThe displayed API is constructed from the current versions of the models in the database, and is therefore considered an unpublished working version. Although APIs are published by Systems Engineering, the system allows the viewing of all versions of published APIs as well as the working version as shown above (Note: the published versions of the APIs are ingested directly from the GitHub repository, whereas the unpublished models are obtained only from the local database). To do this, select the desired version number in the dropdown menu next to the subsystem name.\nNote that “master” also appears in the list of versions and is linked to the contents of the master branch of a subsystem on GitHub. The contents of the master branch are automatically uploaded to the icd database (if there was a change) whenever you refresh the web app or when running the command: icd-git --ingestMissing.\nThere are two checkboxes in the Select dialog that are only enabled for APIs (when only one subsystem is selected).\nInclude client API information (subscribed events, sent commands) Search all TMT subsystems for API dependencies\nSelecting the first checkbox will include sections for subscribed events and sent commands in the API document, as well as columns for subscribers of published events and senders of received commands. By default, these are not displayed in API documents.\nSelecting the second checkbox will enable searching the entire database for subscribers of published commands and senders of received commands. By default, only the selected subsystem is searched for this information.","title":"View a Subsystem API"},{"location":"/webapp/webapp.html#check-for-missing-items","text":"A recent addition to the icd web app is the Missing button that generates a PDF report displaying subscribed events that have no known publisher, or sent commands that are not defined anywhere or component names that refer to nonexisting components.\nThe Missing report is based on the selected subsystem or subsystems. If no subsystem is selected, it reports on all subsystems. If two subsystems are selected (an ICD), the report only lists the missing items directly related to the two subsystems. If you select a single subsystem, the report will list all references that it makes to undefined items (commands, events, components).\nIt is a good ideas to view this report before publishing a subsystem API to find invalid references.","title":"Check for Missing Items"},{"location":"/webapp/webapp.html#generate-source-code-from-the-icd-database","text":"The Generate button lists the languages for which you can generate source code from the ICD database: Scala, Java, Python and TypeScript.\nFirst select a subsystem and, optionally, a version and component. Then select Generate → Scala, for example. The generated source code containing event and command names and keys for the selected subsystem and component(s) is downloaded automatically to a file named *Subsystem*Api.scala in your Downloads directory: For example: TcsApi.scala. The keys can be found in nested objects (namespaces or static classes) starting with the top level object.","title":"Generate Source Code from the ICD Database"},{"location":"/webapp/webapp.html#view-api-history","text":"The history of every published API can also be viewed, including an entry for every time the API is published. Selecting two different version checkboxes enables the Compare button, which shows the changes made between the versions in a JSON based format. Note that you can also compare versions of released APIs on GitHub under https://github.com/tmt-icd, since a version tag is added for each published version. There are also tools for comparing PDF files, which might be useful.\nTo view the API history, select a subsystem, and press the History button. The content area changes as shown in the following:","title":"View API History"},{"location":"/webapp/webapp.html#create-and-view-an-icd","text":"An ICD is formed by taking the intersection of the APIs of two TMT subsystems. That means in order to create an ICD there must be at least two subsystems in the database. The TCS API is created from various subsystem to TCS ICDs that exist and the TCS CODR SDD. The definitive TCS API will be a product of the TCS work packages.\nIt is possible to view ICDs with working/unpublished versions, with one unpublished version and one published version, or two published versions. ICDs can only be published between two published APIs.\nThis example will show how to view a working ICD between the published version 1.12 of the TCS API and the unpublished M1CS subsystem API.\nUpload all the working versions of the APIs needed to form an ICD. First select the version of the subsystem for the ICD. In the figure below the menu to the right of the subsystem shows the available versions. Version 1.12, the version published previously is selected. (To get back to the working version, select the asterisk in the menu.) Note that the content area says API for TCS 1.12 rather than the unpublished label.\nNext, select a second subsystem in the second subsystem menu as shown in the figure to below the Subsystem menu. The figure shows the available subsystems (some may be only local and others automatically ingested from the ICD GitHub repositories). TCS is also selectable since one subsystem component can have an ICD with another in the same subsystem. Selecting M1CS shows the following screenshot (without the red arrow). To get out of ICD mode and back to browsing APIs, select the top item (Select Subsystem) in the second subsystem menu on the Select tab.\nNote that the title shows ICD from TCS to M1CS (unpublished). This means that the displayed ICD is not published by Systems Engineering — it is a draft version.\nAlso note the circle on the screenshot below. The section “Events published by GLC” shows items published by the GLC component. The Subscriber column is a link to the component that subscribes to the event stream. The link can be selected to jump to the subscribing component, regardless of which of the two subsystems it is in.\nThe same is true for commands: There are links to the command senders for received commands.\nThe ability to see and display these links is one of the highest priority features for this project. This is one feature that is not possible with simpler documentation tools.","title":"Create and View an ICD"},{"location":"/webapp/webapp.html#view-icd-history","text":"Like an API, it’s possible to view the history of an ICD between two subsystems.\nWith a published ICD is selected, select the History button as was done in the about viewing an API history. The following screenshot shows the history for the IRIS to TCS ICD. The versions of the APIs are shown as well as the ICD version.","title":"View ICD History"},{"location":"/webapp/webapp.html#print-an-icd-or-api","text":"The last supported feature is to print an API document or save it as a PDF for inclusion as a review deliverable. Ideally, we will just provide a link to the IDBS that reproduces the referenced ICD, but the PDF option in the toolbar allows outputting a PDF version with a table of contents and front page. The figure below shows a portion of the PDF output for our TCS to M1CS ICD Version 1.1.","title":"Print an ICD or API"},{"location":"/webapp/webapp.html#view-a-graph-of-component-relationships","text":"The Graph button in the Select tab displays a dialog for creating a graph of component and subsystem relationships. The graph is based on the selected subsystems and components, which we call the primary components. These are displayed as solid ovals. All the components that the primary components talk (via events or commands) to are then included as dashed ovals. The edges of the graph indicate the flow of events and commands between the components. References to events or commands that were never defined are displayed in red, as are components that do not exist.\nThe figure below shows the Select dialog with the Graph toolbar button and the IRIS.oiwfs.poa component selected:\nPressing the Graph button opens a dialog with options for the graph:\nNote that the graph is created using the GraphViz Dot language. See https://graphviz.org/ for an explanation of layouts and overlap handling. You can also use the icd-viz command line application to produce the same graph. The command line version lets you choose more than two primary components and save the Dot file.\nPressing Apply in the Graph dialog creates this graph for the selected IRIS component:\nThe default colors used for the graph can be found in the icd-viz reference.conf file and can also be overridden with a command line option like -Dicd.viz.color.IRIS=darkgreen (Replace IRIS with the subsystem and the color with a valid Graphviz color). A future version of the icd web app may include a tab in the graph options dialog for configuring the colors.\nHere is a legend for the generated graph:\nIn the above graph, you can see that oiwfs.poa is the primary component (represented as a solid oval). It publishes events to other components, such as IRIS.oiwfs.detector and AOESW.aosq and subscribes to events from NFIRAOS.rtc and TCS.cmIRIS. AOESW.aosq also sends commands to oiwfs.poa, however the command names are not listed, since that option was not selected in the graph dialog. The red question mark in IRIS indicates that oiwfs.poa publishes events that have no known subscribers. The other red arrows indicate that it also subscribes to some events that are not published anywhere (perhaps an error). Displaying these errors is optional. The figure below shows the same graph with the missing events option turned off and command labels turned on.","title":"View a Graph of Component Relationships"}]} \ No newline at end of file diff --git a/webapp/webapp.html b/webapp/webapp.html new file mode 100644 index 0000000000..60bf6d7bf7 --- /dev/null +++ b/webapp/webapp.html @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + + + + + + + + +Using the Web Interface · Interface Database System (IDBS) + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ + +
+
+
+

Using the Web Interface

+

This section describes the web interface for IDBS. The idea is to show each of the possible steps.

+

The browser-based user interface allows ingesting model files and displaying versioned “API”s for each component. An API is defined as all the public functionality of a component and subsystem including inputs and outputs. An ICD is produced by taking the intersection of two published subsystem API documents. ICDs are then also published as versioned documents that depend on published subsystem API versions. The publishing of APIs and ICDs is a role of Systems Engineering and is therefore password protected. It can be performed using the icd web app (requires special command line option to icdwebserver). The web interface can be used to produce draft ICD and API documents that can be shared prior to the official publishing by Systems Engineering.

+

Starting the icd web app

+

To start the icd web app, run:

+
icdwebserver
+
+

By default, this starts the web app on port 9000 on localhost (http://localhost:9000). You can override this with options. For example:

+
icdwebserver -Dhttp.port=9898 -Dhttp.host=192.168.178.77
+
+

Upload Files

+

Installing the web app and uploading through the web app is not a bad way to check the content of model files because it also allows checking to see if the links are entered correctly. icd-db will only check that the files are syntactically correct.

+

Uploading with the browser works best with recent browser versions that support uploading a directory including all files in the directory. By using this feature, you can upload an entire subsystem of model files in one click. If your browser does not support uploading directories, try using Chrome.

+

If the web server is running on your own machine, go to http://localhost:9000. The empty website is shown in the following figure. The upload button is shown circled in red (the red circle does not appear in the UI!)

+

Note
+

The icd web app automatically ingests any released APIs and ICDs on startup by downloading any missing versions from the GitHub repos under https://github.com/tmt-icd. Then you can upload any directories containing model files that you are working on. These will be the considered the “working version” or “*” in the subsystem version menu.

+

Procedure for Uploading Files

+
    +
  1. Select the upload button in the web app. The following figure shows the web page after selecting the upload button:
  2. +
+

+
    +
  1. Select the Choose Files button and navigate to the directory of your model files. It can be a directory holding a single component or a directory containing other directories where each contained directory includes one component as shown in the following figure. The parent directory should be imported at least once to get the subsystem-model.conf file, which is a sibling of the component directories.
  2. +
+

+
    +
  1. Selecting the directory will cause the web service to upload all the contained files and import them into the model file database. The program shows progress and the status area shows any problems. The following figure shows the result of uploading the APS-Model-Files directory. It shows a progress bar in blue at 100%. Files other than icd model files are ignored and a warning is displayed (in case the file name was misspelled).
  2. +
+

+
    +
  1. That’s all for uploading. This can be done over and over and nothing is permanent until the API is published.
  2. +
+

View a Subsystem API

+

The next example shows how to view a subsystem API.

+
    +
  1. +

    With the subsystem uploaded, its API can be viewed in the browser by selecting the subsystem in the subsystem pull-down menu at the top of the screen. The menu shows all the subsystems found in the local database.

  2. +
  3. +

    The browser content area will redraw with the contents of the selected subsystem. The result of selecting APS is shown in the following figure.

  4. +
+

+

A couple of things to note: The area to the left shows a number of links. This area has one link for each component in the subsystem.

+

The content area displays all the components for the subsystem. Clicking on one of the component links jumps to the given component’s information.

+

The displayed API is constructed from the current versions of the models in the database, and is therefore considered an unpublished working version. Although APIs are published by Systems Engineering, the system allows the viewing of all versions of published APIs as well as the working version as shown above (Note: the published versions of the APIs are ingested directly from the GitHub repository, whereas the unpublished models are obtained only from the local database). To do this, select the desired version number in the dropdown menu next to the subsystem name.

+

Note that “master” also appears in the list of versions and is linked to the contents of the master branch of a subsystem on GitHub. The contents of the master branch are automatically uploaded to the icd database (if there was a change) whenever you refresh the web app or when running the command: icd-git --ingestMissing.

+

+

There are two checkboxes in the Select dialog that are only enabled for APIs (when only one subsystem is selected).

+
    +
  • Include client API information (subscribed events, sent commands)
  • +
  • Search all TMT subsystems for API dependencies
  • +
+

Selecting the first checkbox will include sections for subscribed events and sent commands in the API document, as well as columns for subscribers of published events and senders of received commands. By default, these are not displayed in API documents.

+

Selecting the second checkbox will enable searching the entire database for subscribers of published commands and senders of received commands. By default, only the selected subsystem is searched for this information.

+

Check for Missing Items

+

A recent addition to the icd web app is the Missing button that generates a PDF report displaying subscribed events that have no known publisher, or sent commands that are not defined anywhere or component names that refer to nonexisting components.

+

+

The Missing report is based on the selected subsystem or subsystems. If no subsystem is selected, it reports on all subsystems. If two subsystems are selected (an ICD), the report only lists the missing items directly related to the two subsystems. If you select a single subsystem, the report will list all references that it makes to undefined items (commands, events, components).

+

+

It is a good ideas to view this report before publishing a subsystem API to find invalid references.

+

Generate Source Code from the ICD Database

+

The Generate button lists the languages for which you can generate source code from the ICD database: Scala, Java, Python and TypeScript.

+

First select a subsystem and, optionally, a version and component. Then select Generate → Scala, for example. The generated source code containing event and command names and keys for the selected subsystem and component(s) is downloaded automatically to a file named *Subsystem*Api.scala in your Downloads directory: For example: TcsApi.scala. The keys can be found in nested objects (namespaces or static classes) starting with the top level object.

+

+

View API History

+

The history of every published API can also be viewed, including an entry for every time the API is published. Selecting two different version checkboxes enables the Compare button, which shows the changes made between the versions in a JSON based format. Note that you can also compare versions of released APIs on GitHub under https://github.com/tmt-icd, since a version tag is added for each published version. There are also tools for comparing PDF files, which might be useful.

+

To view the API history, select a subsystem, and press the History button. The content area changes as shown in the following:

+

+

Create and View an ICD

+

An ICD is formed by taking the intersection of the APIs of two TMT subsystems. That means in order to create an ICD there must be at least two subsystems in the database. The TCS API is created from various subsystem to TCS ICDs that exist and the TCS CODR SDD. The definitive TCS API will be a product of the TCS work packages.

+

It is possible to view ICDs with working/unpublished versions, with one unpublished version and one published version, or two published versions. ICDs can only be published between two published APIs.

+

This example will show how to view a working ICD between the published version 1.12 of the TCS API and the unpublished M1CS subsystem API.

+
    +
  1. +

    Upload all the working versions of the APIs needed to form an ICD.

  2. +
  3. +

    First select the version of the subsystem for the ICD. In the figure below the menu to the right of the subsystem shows the available versions. Version 1.12, the version published previously is selected. (To get back to the working version, select the asterisk in the menu.) Note that the content area says API for TCS 1.12 rather than the unpublished label.

  4. +
+

+
    +
  1. Next, select a second subsystem in the second subsystem menu as shown in the figure to below the Subsystem menu. The figure shows the available subsystems (some may be only local and others automatically ingested from the ICD GitHub repositories). TCS is also selectable since one subsystem component can have an ICD with another in the same subsystem. Selecting M1CS shows the following screenshot (without the red arrow). To get out of ICD mode and back to browsing APIs, select the top item (Select Subsystem) in the second subsystem menu on the Select tab.
  2. +
+

+

Note that the title shows ICD from TCS to M1CS (unpublished). This means that the displayed ICD is not published by Systems Engineering — it is a draft version.

+

Also note the circle on the screenshot below. The section “Events published by GLC” shows items published by the GLC component. The Subscriber column is a link to the component that subscribes to the event stream. The link can be selected to jump to the subscribing component, regardless of which of the two subsystems it is in.

+

+

The same is true for commands: There are links to the command senders for received commands.

+

+

The ability to see and display these links is one of the highest priority features for this project. This is one feature that is not possible with simpler documentation tools.

+

View ICD History

+

Like an API, it’s possible to view the history of an ICD between two subsystems.

+
    +
  1. With a published ICD is selected, select the History button as was done in the about viewing an API history. The following screenshot shows the history for the IRIS to TCS ICD. The versions of the APIs are shown as well as the ICD version.
  2. +
+

+

Print an ICD or API

+

The last supported feature is to print an API document or save it as a PDF for inclusion as a review deliverable. Ideally, we will just provide a link to the IDBS that reproduces the referenced ICD, but the PDF option in the toolbar allows outputting a PDF version with a table of contents and front page. The figure below shows a portion of the PDF output for our TCS to M1CS ICD Version 1.1.

+

+

View a Graph of Component Relationships

+

The Graph button in the Select tab displays a dialog for creating a graph of component and subsystem relationships. The graph is based on the selected subsystems and components, which we call the primary components. These are displayed as solid ovals. All the components that the primary components talk (via events or commands) to are then included as dashed ovals. The edges of the graph indicate the flow of events and commands between the components. References to events or commands that were never defined are displayed in red, as are components that do not exist.

+

The figure below shows the Select dialog with the Graph toolbar button and the IRIS.oiwfs.poa component selected:

+

+

Pressing the Graph button opens a dialog with options for the graph:

+

+

Note that the graph is created using the GraphViz Dot language. See https://graphviz.org/ for an explanation of layouts and overlap handling. You can also use the icd-viz command line application to produce the same graph. The command line version lets you choose more than two primary components and save the Dot file.

+

Pressing Apply in the Graph dialog creates this graph for the selected IRIS component:

+

+

The default colors used for the graph can be found in the icd-viz reference.conf file and can also be overridden with a command line option like -Dicd.viz.color.IRIS=darkgreen (Replace IRIS with the subsystem and the color with a valid Graphviz color). A future version of the icd web app may include a tab in the graph options dialog for configuring the colors.

+

Here is a legend for the generated graph:

+

+

In the above graph, you can see that oiwfs.poa is the primary component (represented as a solid oval). It publishes events to other components, such as IRIS.oiwfs.detector and AOESW.aosq and subscribes to events from NFIRAOS.rtc and TCS.cmIRIS. AOESW.aosq also sends commands to oiwfs.poa, however the command names are not listed, since that option was not selected in the graph dialog. The red question mark in IRIS indicates that oiwfs.poa publishes events that have no known subscribers. The other red arrows indicate that it also subscribes to some events that are not published anywhere (perhaps an error). Displaying these errors is optional. The figure below shows the same graph with the missing events option turned off and command labels turned on.

+

+
+ + +
+
+
+
+ + +
+ + + + + + + + diff --git a/workflow/workflow.html b/workflow/workflow.html new file mode 100644 index 0000000000..89093d2b76 --- /dev/null +++ b/workflow/workflow.html @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + +IDBS Workflow and Creating ICDs · Interface Database System (IDBS) + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ +
+
+
+

IDBS Workflow and Creating ICDs

+

This section describes how the IDBS fits into the software development process at TMT. This workflow is shown in the context of the TMT Software Quality Assurance Plan and Software Development Process (SQUAP and SDP) [RD01], which describes the entire software development process.

+

OMOA components consist of HCDs, Assemblies, Sequencers, and Applications. The components are developed incrementally and independently of other subsystem’s components.

+

Each component has a public interface or application programming interface (API). The API is based on the services provided by common software. The API shows all the available functionality of a component and subsystem.

+

Each TIO software ICD consists of a framework part and a detailed part. The framework part is written in Word according to the TIO Systems Engineering template. The detailed part is generated from the ICD-DB and can change more frequently without requiring updates to the framework document - at least in the case where the framework information does not change.

+

A component developer creates a set of model files for each component that describes the component and its interfaces (see the section on model files). These model files are text files. When the component interface changes, the developer updates the model files, validates them, and when ready, checks them into a dedicated repository for model files at the GitHub site: (https://github.com/tmt-icd).

+

When working on or changing an interface used by another TIO subsystem that will be part of an ICD, the component developer should work with the other subsystem developers to determine the correct functionality and API.

+

Once the model files are checked in, TIO Systems Engineering determines when the new version of a subsystem’s API can be published and given a new incremental version number. Systems Engineering will review any changes that impact other subsystems and ensure they are aware of and agree with changes that will be part of an ICD. New releases of the API documents can be published and will be seen as published in the ICD-DB web user interface.

+

TIO Systems Engineering also determines when a new ICD can be generated based on the APIs of the constituent subsystems and manages the publication of a new detailed ICD release. When published, the new ICD is also shown as published in the ICD-DB web user interface.

Note
+

It may be necessary to click the browser refresh button to see a newly published API or ICD that is not yet in the local icd database (The icd web app then automatically ingests any newly published APIs and ICDs into the local database). The command icd-git –ingest will also update the local database from the released versions on GitHub.

+
+ + +
+
+
+
+ + +
+ + + + + + + +